关闭

Android__数据存储

标签: android数据库数据存储
102人阅读 评论(0) 收藏 举报
分类:

android端的三种数据存储方式:

文件存储
SharedPreference存储
SQLite数据库存储

文件存储:
Context类提供了openFileOutput()的方法,通过java的输出流将数据存储到默认路径
/data/data//files/目录下
提供了InputFileOutput()的方法,通过java的读入流
一般的用户是访问不了手机,必须要有root权限才可以
所以这一部分的内容主要通过模拟器才能显示效果

案例:实现数据的保存和读取,按返回键之后不会消失

public class MainActivity extends Activity {

    private EditText editText;
    protected void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        //初始化
        editText = (EditText)findViewById(R.id.editText);

        String getinputText = load();



        if(!TextUtils.isEmpty(getinputText)){


            editText.setText(getinputText);

            editText.setSelection(getinputText.length());

            Toast.makeText(this, "Restore Success",
                    Toast.LENGTH_SHORT).show();
        }




    }

    //保证在销毁之前保存数据
    protected void onDestroy(){
        super.onDestroy();  
        String inputText =editText.getText().toString();
        savedata(inputText);
    }

    private void savedata(String inputText) {

        FileOutputStream out = null;
        BufferedWriter writer = null;

        try {

            out = openFileOutput("data", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            if(writer!=null){
                try {
                    writer.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    //从默认的"data"读入,editText.setText(getinputText);
    public String load(){

        InputStream in =null;
        BufferedReader br = null;

        StringBuffer sb = new StringBuffer();

        try {
            in = openFileInput("data");
            br = new BufferedReader(new InputStreamReader(in));

            String line ="";
            while((line=br.readLine())!=null){
                sb.append(line);
            }

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            if(br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }


        return sb.toString();

    }


}

SharedPreference存储

以键值对的方式存储数据

获取SharedPreference对象的三种方法:
1 Context类下的getSharedPreferences()
2 Activity类的getPreferences()
3 PreferenceManager类的getDefaultSharedPreferences()

得到对象之后

存储过程分三步实现:
1 调用SharedPreference对象下的edit()方法获取一个SharedPreference.Edit对象
SharedPreference.Editor editor =
getSharedPreferences(“data”,MODE_PRIVATE).edit();
2 添加数据
editor.putString(“name”,”Tom”);
3 提交数据commit()
editor.commit();

读取过程:
创建SharedPreferences pref = getSharedPreferences(“data”,MODE_PRIVATE);

String name = pref.getString(“name”,”“);

用getString(key,defaultValue),
getInt(key,defaultValue),
getBoolean(key,defaultValue)等方法
获取对应的数据

实现记住密码功能:

public class LoginActivity extends Activity {

    private EditText accountEditText;
    private EditText passwordEditText;

    private Button loginButton;
    //复选框控件
    private CheckBox rememberPasswordBox;

    //存储
    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(LoginActivity.this);

        accountEditText = (EditText) findViewById(R.id.account);
        passwordEditText = (EditText) findViewById(R.id.password);

        loginButton = (Button) findViewById(R.id.login_button);
        rememberPasswordBox = (CheckBox) findViewById(R.id.check_password);

        boolean rememberPassword = sharedPreferences.getBoolean("remember_password", false);

        if(rememberPassword){
            String account = sharedPreferences.getString("account", "");
            String password = sharedPreferences.getString("password", "");

            accountEditText.setText(account);
            passwordEditText.setText(password);
            rememberPasswordBox.setChecked(true);
        }

        loginButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String account = accountEditText.getText().toString();
                String password = passwordEditText.getText().toString();

                if (account.equals("admin") && password.equals("admin")) {

                    editor = sharedPreferences.edit();
                    //复选框是否被勾中监听机制
                    if(rememberPasswordBox.isChecked()){
                        editor.putBoolean("remember_password", true);
                        editor.putString("account", account);
                        editor.putString("password", password);

                    }else{
                        editor.clear();
                    }

                    //别忘记提交
                    editor.commit();

//                  Toast.makeText(LoginActivity.this, "login success",
//                          Toast.LENGTH_SHORT).show();

                    Intent intent = new Intent(LoginActivity.this,SucessActivity.class);

                    startActivity(intent);

                } else {
                    Toast.makeText(LoginActivity.this,
                            "account or password error", Toast.LENGTH_SHORT)
                            .show();
                }

            }
        });

    }
}

SQLite数据库存储:
SQLite是一种轻量级的关系型数据库
可以存储各种类型的文件

其操作和MySQL的语法基本相同

四种数据类型:
integer 整型 real浮点型 text 文本类型 blob 二进制型

创建数据库,插入一个表
先新建一个MyDatabase extends SQLiteOpenHelper
SQLiteOpenHelper是一个数据库管理器,负责对数据库的创建和表的创建,更新等操作

public class MyDatabase extends SQLiteOpenHelper {

public static final String CREATE_BOOK ="create table Book("
        + "id integer primary key autoincrement,"
        + "author text,"
        + "pages integer,"
        + "name text,"
        + "price real)";

//在这里随便添加语句,并在
//public void onUpgrade()更新,只有修改版本号大于旧版本号的时候才会进行更新操作
//

private Context mContext;

public MyDatabase(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
mContext = context;
}

//如果数据库已经创建,而且table也创建了,你下一次就不会重复执行这个方法了
@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

    db.execSQL(CREATE_BOOK);


    Toast.makeText(mContext, "create database success", 
            Toast.LENGTH_SHORT).show();

}

//只有当版本出现更新的时候才会进行调用这个方法
    @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

    switch(oldVersion){
    case 1:db.execSQL(CREATE_BOOK_CATEGORY2);
    default:
    }
}

}

接着在MainActivity中
public class MainActivity extends Activity {
//  private MyDatabase dbHelper;
//  protected void onCreate(Bundle savedInstanceState){
//      super.onCreate(savedInstanceState);
//      setContentView(R.layout.main_activity);
//      
//      //初始化数据库,创建数据库BookStore.db
//      //改变版本号就可以
//      //public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){};
//      dbHelper = new MyDatabase(this, "BookStore.db", null,1);
//      
//      Button createdatabase =(Button)findViewById(R.id.button);
//      createdatabase.setOnClickListener(new OnClickListener() {
//          
//          @Override
//          public void onClick(View v) {
//              // TODO Auto-generated method stub
//              dbHelper.getWritableDatabase();
////                
//              
//          }
//      });

}
以下是一些在MainActivity的SQLite语句

添加,插入

//      Button addData = (Button)findViewById(R.id.add);
//      addData.setOnClickListener(new OnClickListener() {
//          
//          @Override
//          public void onClick(View v) {
//              // TODO Auto-generated method stub
//              SQLiteDatabase db = dbHelper.getWritableDatabase();
//              ContentValues values = new ContentValues();
//              
//              //开始组装数据
//              values.put("name", "The Da Vinci Code");
//              values.put("author", "Dan Brown");
//              values.put("pages", 454);
//              values.put("price",15);
//              
//              db.insert("Book", null, values);
//              values.clear();
//              
//              values.put("name", "The Lost Symbol");
//              values.put("author", "Dan Brown");
//              values.put("pages", 510);
//              values.put("price",19);
//              
//              
//              db.insert("Book", null, values);
//              
//              Toast.makeText(MainActivity.this, "insert ok",
//                      Toast.LENGTH_SHORT).show();
//              
//          }
//      });

修改
db.update("Book", values, "name=?", new String[]{"The Da Vinci Code"});
删除
//?占位符    1参数名称
//  db.delete("Book", "id>?", new String[]{"1"});

查询
Button query = (Button)findViewById(R.id.query);
//      
//      query.setOnClickListener(new OnClickListener() {
//          
//          int count=0;
//          
//          @Override
//          public void onClick(View v) {
//              count++;
//              // TODO Auto-generated method stub
//              SQLiteDatabase db = dbHelper.getWritableDatabase();
//              
//              //查表自定义
//              Cursor cursor = db.query("Book", null, null, null, null, null, null);
//              
//              if(cursor.moveToFirst()){//从第个迭代开始
//                  do{
//                      if(count>=2){
//                          break;
//                      }
//                      //遍历Cursor对象,取出数据并打印
//                      String name = cursor.getString(cursor.getColumnIndex("name"));
//                      String author = cursor.getString(cursor.getColumnIndex("author"));
//                      int pages = cursor.getInt(cursor.getColumnIndex("pages"));
//                      double  price = cursor.getDouble(cursor.getColumnIndex("price"));
//                      
//                      Toast.makeText(MainActivity.this, "name: "+name+" author: "+author
//                              +" price: "+price+" pages: "+pages, Toast.LENGTH_SHORT).show();
//                      
//                      
//                  }while(cursor.moveToNext());
//                  
//                  
//              }
//          }
//      });

代替,事务操作,特别是关于重要的数据操作,如银行
Button replace = (Button)findViewById(R.id.replace_data);
//      replace.setOnClickListener(new OnClickListener() {
//          
//          @Override
//          public void onClick(View v) {
//              // TODO Auto-generated method stub
//              SQLiteDatabase db = dbHelper.getWritableDatabase();
//              
//              db.beginTransaction();//开始事务
//              
//              try {
//                  db.delete("Book", null, null);
////                    if(true){
////                        //添加异常,使下面的操作不成功,事务失败
////                        throw new NullPointerException();
////                    }
//                  
//                  ContentValues values = new ContentValues();
//                  values.put("name", "Sb");
//                  values.put("author", "Mr.Sb");
//                  values.put("pages", 720);
//                  values.put("price", 80.3);
//                  
//                  db.insert("Book", null, values);
//                  db.setTransactionSuccessful();//事务执行成功
//              } catch (Exception e) {
//                  // TODO: handle exception
//                  e.printStackTrace();
//              }finally{
//                  Toast.makeText(MainActivity.this, "replace ok",
//                          Toast.LENGTH_SHORT).show();
//                  db.endTransaction();//结束事务
//                  
//              }
//          }
//      });
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:17750次
    • 积分:389
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    最新评论
  • 图片加载器

    xiaoxxxlong: 能把 demo 地址给出来么 直接跑着测试哇。。最近开发需要处理图片的东东 ,,谢谢楼主