• 数据存储


    一、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();
                    }
                }
            });
            
  • 相关阅读:
    wtk2.1的问题
    扫雷大体完成了
    手机操作系统龟兔赛跑 Symbian深信将打败微软
    Practical UML™ A HandsOn Introduction for Developers
    有意思
    进展
    扫雷完成了:)
    Linux
    有关msn的api的两个网站
    csdn中讨论j2me之前途....
  • 原文地址:https://www.cnblogs.com/lyjs/p/5282463.html
Copyright © 2020-2023  润新知