Android开发实践 数据存储 学习、应用、总结

转自:http://blog.csdn.net/smartbetter/article/details/51469961

所有应用程序必然有数据的输入输出,Android也是一样的,Android应用程序的参数设置、运行状态数据这些都需要保存到外部存储器上,保证关机后数据不丢失,如下是几种Android常见的数据存储方式: 
SharedPreferences:适合保存少量数据(一些配置信息、积分之类); 
SQLite:一个真正轻量级数据库,没有后台进程,整个数据库就对应于一个文件,适合大量数据需要存储、访问的情况。 
下来详细来看看它们的用法。

1.SharedPreferences

SharedPreferences保存的数据主要是简单类型的key-value对。 
1)SharedPreferences接口 
主要负责读取应用程序的Preferences数据,提供了如下常见方法来访问SharedPreferences中的key-value对:

boolean contains(String key) // 判断是否包含key对应的数据
abstract Map<String, ?> getAll() // 获取全部key-value对
boolean getXxx(String key, xxx defValue) // 获取指定key的value值

SharedPreferences本身是一个接口,无法创建实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,mode参数支持如下几个值:

Context.MODE_PRIVATE // 私有,只能被本应用程序读写
Context.MODE_WORLD_READABLE // 能被其他应用程序读但不可写
Context.MODE_WORLD_WRITEABLE // 能被其他应用程序读写

2)Editor 
SharedPreferences接口本身没有写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即获取Editor对象,Editor提供了如下方法写入数据:

Editor clear() // 清空所有数据
Editor putXxx(String key, xxx value) // 存入指定key-value
Editor remove(String key) // 删除指定key-value
boolean commit() // 编辑完成后提交修改

3)SharedPreferences存储位置 
SharedPreferences数据总是以xml格式保存在/data/data/package name/shared prefs目录下

2.SharedPreferences的用法

public class SharedPreferencesTest extends Activity {
    SharedPreferences sp;
    Editor editor;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sp = getSharedPreferences("config", MODE_PRIVATE);
        editor = sp.edit();
        ...
        // 存入一个随机数
        editor.putInt("random", (int) (Math.random() * 100));
        editor.commit();
        ...
        // 读取字符串数据
        String text = sp.getString("text", "text"); 
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

读写其他应用的SharedPreferences需要获取其他程序所对应的Context

uContext= createPackageContext("com.gc.other", Context.CONTEXT_IGNORE_SECURITY);

然后使用其他程序的Context获取对应的SharedPreferences实例,然后就可以类似上面进行读写数据了。

SharedPreferences sp = uContext.getSharedPreferences("uconfig",Context.MODE_WORLD_READABLE);

3.SQLite数据库

SQLite是一个嵌入式的数据库引擎,适用于资源有限的设备上适量存取数据(SQLite数据库只是一个文件)。

SQLiteDatabase表示一个数据库(底层是一个数据库文件),Android通过SQLiteDatabase对象来管理、操作数据库。

4.SQLiteDatabaseHelper类

SQLiteDatabaseHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。 
一般用法是创建SQLiteDatabaseHelper的子类并扩展它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法。

SQLiteDatabaseHelper包含如下常用方法:

getReadableDatabase() // 以读写的方式打开数据库对应的SQLiteDatabase对象
getWritableDatabase() // 以写的方式打开数据库对应的SQLiteDatabase对象
onCreate(SQLiteDatabase db) // 第一次创建回调
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) // 当数据库版本更新时回调
close() // 关闭所有打开的SQLiteDatabase

5.创建SQLite数据库

继承SQLiteOpenHelper,创建UserInfoSqliteOpenHelper数据库帮助类

public class UserInfoSqliteOpenHelper extends SQLiteOpenHelper {
    public UserInfoSqliteOpenHelper(Context context) {
        /**
         * context 上下文
         * name :数据库文件的名称
         * factory:用来创建cursor对象的(默认null,一般在公司开发这里都指定null)
         * version:数据库的版本号(从1开始),如果发生改变会调用onUpgrade方法;
         *          verison在Android4.0以下版本可以降级,在4.0及以上版本不能降级
         */
        super(context, "userinfo.db", null, 2); 
    }   
    /**
     * 数据库第一次创建时会调用(适合做表结构的初始化,需要执行sql语句,执行sql语句需使用SqliteDatabase数据库对象)
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //执行一个sql语句创建表
        db.execSQL("create table info(id integer primary key autoincrement ,name varchar(20),email varchar(20));
    }
    /**
     * 数据库版本升级时会调用该方法(适合做表结构的升级,需要执行sql语句)
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table info add email varchar(11)");
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

然后就可以在XxxActivity中创建出数据库

//创建一个数据库帮助类对象
UserInfoSqliteOpenHelper dbHelper = new UserInfoSqliteOpenHelper(this);
//调用帮助类对象的getReadableDatabase()方法,帮助我们将数据库创建出来
SQLiteDatabase db = dbHelper.getReadableDatabase();
//SQLiteDatabase db = dbHelper.getWritableDatabase();
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

6.SQLite数据库的增删改查

首先创建用户实体类UserBean

public class UserBean {
    public int id;
    public String name;
    public String email;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

接下来将增删改差封装起来,如下UserInfoDB:

public class UserInfoDB {
    private UserInfoSqliteOpenHelper dbHelper;
    public UserInfoDB(Context context){
        //创建一个数据库帮助类对象
        dbHelper = new UserInfoSqliteOpenHelper(context);
    }
    /**
     * 增
     */
    public boolean add(UserBean bean){
        /**
         * table:表名
         * nullColumnHack: 可以为null,公司开发中一般传null.
         * values: 表中添加的一行的数据内容,ContentValues以Map封装
         */
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", bean.name);
        contentValues.put("email", bean.email);
        // 执行插入,返回值(如果插入成功将插入成功的行号返回,失败返回-1)
        long result = db.insert("info", "null", contentValues); // 内部在拼装sql语句
        // 关闭数据库
        db.close();
        if(result == -1){
            return false;
        }else{
            return true;
        }
    }
    /**
     * 删
     */
    public int del(String name){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        /**
         * table:表名:
         * whereClause:删除条件
         * whereArgs:删除条件占位符的参数
         */
        // 返回值是:成功删除了多少行
        int result = db.delete("info", "name = ?", new String[]{name});
        //关闭数据库
        db.close();
        return result;
    }
    /**
     * 改
     */
    public int update(UserBean bean){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        /**
         * table: 表名
         * values:更改字段的内容,以map封装
         * whereClause:更新条件
         * whereArgs:更新条件占位符的参数
         */
        //sql:update info set email='100@126.com'where name='zhangsan';
        ContentValues contentValues = new ContentValues();
        contentValues.put("email", bean.email);
        //返回的值:成功修改了多少行
        int result = db.update("info", contentValues, "name = ?", new String[]{bean.name});
        //关闭数据库
        db.close();
        return result;
    }
    /**
     * 查
     */
    public void query(String name){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        /**
         * table:表名
         * columns:查询的列名(如果null代表查询所有)
         * selection:查询条件
         * selectionArgs:查询条件占位符的参数
         * groupBy:以什么分组
         * having:分组的条件
         * orderBy:按哪个字段排序
         */
        Cursor cursor = db.query("info", new String[]{"id","name","email"}, "name  = ?", new String[] {name}, null, null, "id desc");
        /**
         * 判断结果集中是否有数据
         */
        if(cursor != null && cursor.getCount() >0){
            //循环遍历结果集获取结果集的内容
            while(cursor.moveToNext()){
                //获取这一行上所有的数据内容
                int id = cursor.getInt(0);
                String name2 = cursor.getString(1);
                String email = cursor.getString(2);
                System.out.println(id+":"+name2+":"+email);
            }
        }
        //关闭数据库
        db.close();
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

到此我们就可以通过创建UserInfoDB实例,调用该实例的方法来增删改差数据库了

UserInfoDB userInfoDB = new UserInfoDB(this);
// 增
UserBean userBean = new UserBean();
userBean.name = "wangwu";
userBean.email = "900@126.com";
boolean result = userInfoDB.add(userBean); 

// 删
int num = userInfoDB.del("zhangsan");
Toast.makeText(mContext, "成功删除"+num+"行", 0).show();

// 改
UserBean userBean1 = new UserBean();
userBean1.name = "lisi";
userBean1.email = "200@126.com";
int num2 = userInfoDB.update(userBean1);
Toast.makeText(mContext, "成功修改"+num2+"行", 0).show();

// 查
userInfoDB.query("wangwu");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值