zoukankan      html  css  js  c++  java
  • 数据存储

    一、SharedPreferences 对象

    1、SharedPreferences 是使用键值对的方式来存储数据的。而且还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串,读取出来的数据仍然是字符串。

    2、如何得到SharedPreferences对象:

    1. Context类中的getSharedPreferences(),接收两个参数,一个参数用于指定SharedPreferences 文件的名称,第二个参数用于指定操作模式,MODE_PRIVATE(只有当前的应用程序才可以对这个文件进行读写)、MODE_MULTI_PROCESS(一般用于多个进程中对同一个文件进行读写)。
    2. Activity中的getPreferences()方法,只接收一个操作模式参数,使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。
    3. PreferenceManager 类中的getDefaultSharedPreferences()方法。这是一个静态方法,它接收一个Context 参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences 文件

    3、使用SharedPreferences写数据

         saveData.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    //1. 调用SharedPreferences 对象的edit()方法来获取一个SharedPreferences.Editor 对象。
                    SharedPreferences.Editor editor=getSharedPreferences("data", MODE_PRIVATE).edit();
                    //2. 向SharedPreferences.Editor 对象中添加数据,
                    editor.putString("name", "Tom");
                    editor.putInt("age", 26);
                    editor.putBoolean("married", false);
                    //3. 调用commit()方法将添加的数据提交,
                    editor.commit();
                }
            });

     4、使用SharedPreferences读数据

          restoreData.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE);
                    //第一个参数是键,第二个参数是默认值
                    String name=pref.getString("name", "");
                    int age=pref.getInt("age", 0);
                    boolean married=pref.getBoolean("married", false);
                    Log.d("MainActivity", "name is "+name);
                    Log.d("MainActivity", "age is "+age);
                    Log.d("MainActivity", "married is "+married);
                }
            });

     二、SQLite数据库存储

    SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。
    SQLiteOpenHelper 中还有两个非常重要的实例方法, getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在
    则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。

    SQLiteOpenHelper 中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收四个参数,

    • 第一个参数是Context,这个没什么好说的,必须要有它才能对数据库进行操作。
    • 第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。
    • 第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。
    • 第四个参数表示当前数据库的版本号, 可用于对数据库进行升级操作

    创建自己的MyDatabaseHelper

    package com.example.sqlitepratice;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.widget.Toast;
    
    public class MyDatabaseHelper extends SQLiteOpenHelper{
        
        
        public MyDatabaseHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
            mContext=context;
        }
    
        public static final String CREATE_BOOK="create table Book("
                +"id integer primary key autoincrement, "
                +"author text,"
                +"price real,"
                +"pages integer,"
                +"name text)";
        
        public static final String CREATE_CATEGORY="create table Category("
                        +"id integer primary key autoincrement,"
                        +"category_name text,"
                        +"category_code integer);";
        private Context mContext;
        
        
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(CREATE_BOOK);//执行这条语句
            db.execSQL(CREATE_CATEGORY);
            Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
            // TODO Auto-generated method stub
            db.execSQL("drop table if exists Book");
            db.execSQL("drop table if exists Category");
            onCreate(db);
        }
    
    }

    注意点:

    升级数据库的时候,SQLiteOpenHelper 的构造方法里接收的第四个参数,它表示当前数据库的版本号,之前我们传入的是1,现在只要传入一个比1 大的数,就可以让onUpgrade()方法得到执行了

            //查询数据
            queryData.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=dbHelper.getReadableDatabase();
                    Cursor cursor=db.query("Book", null, null, null, null, null, null);
                    if(cursor.moveToFirst()){
                        do{
                            String name=cursor.getString(cursor.getColumnIndex("name"));
                            Log.d("MainActivity", "name is "+name);
                        }while(cursor.moveToNext());
                    }
                }
            });
            //删除数据
            deleteData.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=dbHelper.getWritableDatabase();
                    db.delete("Book", "price>?", new String[]{"500"});
                }
            });
            //插入数据
            insertData.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=dbHelper.getWritableDatabase();
                    ContentValues values=new ContentValues();
                    values.put("price",563);
                    db.update("Book", values, "name=?",new String[]{"Tom"});
                    
                }
            });
            //添加数据
            addData.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=dbHelper.getWritableDatabase();
                    ContentValues values=new ContentValues();
                    values.put("name", "Tom");
                    values.put("author", "Dan Brown");
                    values.put("pages", 123);
                    values.put("price", 12.36);
                    db.insert("Book", null, values);
                    
                }
            });

    使用事务

       replaceData.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=dbHelper.getReadableDatabase();
                    db.beginTransaction();
                    try {
                        db.delete("Book", null, null);
                        if(true){
                            throw new NullPointerException();
                        }
                        ContentValues values=new ContentValues();
                        values.put("name", "Java for Java");
                        values.put("author","Joe");
                        db.insertOrThrow("Book", null, values);
                        db.setTransactionSuccessful();
                    } catch (Exception e) {
                        // TODO: handle exception
                    }finally{
                        db.endTransaction();
                    }
                }
            });
            
  • 相关阅读:
    topcoder srm 681 div1
    topcoder srm 683 div1
    topcoder srm 684 div1
    topcoder srm 715 div1
    topcoder srm 685 div1
    topcoder srm 687 div1
    topcoder srm 688 div1
    topcoder srm 689 div1
    topcoder srm 686 div1
    topcoder srm 690 div1 -3
  • 原文地址:https://www.cnblogs.com/lyjs/p/5282463.html
Copyright © 2011-2022 走看看