继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android开发之数据持久化

热爱生活的猫
关注TA
已关注
手记 14
粉丝 38
获赞 1107
  1. 文件存储
    Android系统下的文件分为两类:一类是共享文件,如存储在SD卡上的文件,这种文件任何的Android应用都可以访问;另一类是私有文件,即Android应
    用自己创建的文件。Android中对文件的读写与javaSE的文件读写一样,都是采用IO流。但是对于私有文件,只有具有访问权限的用户才能使用,因此,Android提供了一组特有的API来完成对私有文件的读写。
    即 Context类中提供的

FileInputStream openFileInput(String name)和
FileOutputStream openFileOutput(String name,int mode)方法

,获取文件输出流或者文件输入流,之后就是利用 Java 的各种流来进行读写操作就可以了。其中参数mode,即对文件的操作模式。

  1. SharedPreferences

sharedpreference是一种轻量级的键值对存储机制,只用于存储基本数据类型,主要针对系统配置信息的保存。

三种方法获取SharedPreferences对象
1, Activity提供了如下获取方法

public SharedPreferences getPreferences(int mode)

2,PreferenceManager提供的方法,

// SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);

其实质是调用了context的getSharedPreferences方法,故第三中方法为:

// SharedPreferences pref =getSharedPreferences("myPref", MODE_PRIVATE);

//写入数据通过SharedPreferences 获取Editor对象来完成;

Editor editor = pref.edit();
通过Editor对象存数据(数据以xml文档的形式存放)
editor.putString("name","张三");
edtior.commit();    //提交,完成数据的存入

//获取数据:直接调用SharedPreferences 的getXXX()方法实现

pref.getString("name","default")  

3,SQLite

SQLite不支持静态数据类型,而是使用列关系,意味着它的数据类型不具有表列属性,而有数据本身的属性。也就是说,当某个数据写入数据库的
时候,SQLite额会检测它的类型,如果该类型与关联的列不匹配,则SQLIT额会尝试将该值转换成列类型,如果不能转化,则改制将作为其本身所具有的类型存储。所有说可以近似的将SQLite数据库看做是一种无长度限制的无数据类型的数据库。

1,Android提供了SQliteOpenHelper帮助用户创建一个数据库。
SQliteOpenHelper类囊括了创建数据库和对数据库进行版本管理的相关方法。
前面我们已经知道, 调用 SQLiteOpenHelper的 getReadableDatabase()或 getWritableDatabase()方法是可以用于创建和升级数据库的,
不仅如此,这两个方法还都会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行 CRUD 操作了。

2,获取SqliteDataBase类对象db

  • 使用SQLiteOpenHelper访问数据库,需要调用个getWritableDatabase()或者XX来获得一个SQliteDataBase对象 或者 使用context对象的openOrCreateDatabase方法,如下:
SQLiteDatabase db = openOrCreateDatabase("user.db", MODE_PRIVATE, null);     
不推荐此方法
  • CRUD
db.execSQL(String sql)   //直接执行一个sql语句

db.insert("Book", null, Contentvalues对象)  //插入数据,
db.upDate(表名、更新的内容、3,4)  //更新,第3,4个参数用于限定修改的具体位置
eg:
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The DaVinci Code" });  //上述代码想表达的意图就是,将名字是 The Da Vinci Code
的这本书的价格改成 10.99。
db.delete(table_name,2,3);   //第2,3个参与用于限定删除的具体位置
db.Query()     //查询操作,返回一个Cursor对象,类似于java中的ResultSet

ContentValues //类似于hashmap,通过此对象实现向数据库中插入数据
注意:每次再次使用ContentValues对象的时候需要先clear()
最后关闭:ContentValues对象和SqliteDataBase对象、Cursor对象。

  • 总结:
    Android 常用的数据持久化方式,包括文件存储、SharedPreferences 存储以及数据库存储。其中文件适用于存储一些简单的文本数据或者二进制数据,SharedPreferences适用于存储一些键值对,而数据库则适用于存储那些复杂的关系型数据。
    继承SQLiteOpenHelper重写下面两个方法,

public String sql="create table "+TABLE_NAME+" (id integer primary key autoincrement,name text,age integer)";

//  在第一次**创建数据库**的时候调用,此处创建数据库的同时创建一张表person
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(sql);
        Toast.makeText(mContext, "DataBase create success", Toast.LENGTH_SHORT).show();
    }
//  数据库升级的时候调用,其中参数arg2即数据库的版本,只要保证后一次的版本高于前一次,此方法就会被调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        // TODO Auto-generated method stub
        Log.i("info", " onUpgrade ");
        db.execSQL("drop table if exists "+TABLE_NAME);
        onCreate(db);
    }
可以发现这里每次更新操作的时候我们都是直接将原有的表删除,然后重新创建,在实际应用中就会出现数据丢失的问题,解决办法是可以对arg2作一些判断,eg:
switch (arg2) {
case 1:
db.execSQL(sql);
case 2: / /版本升级
db.execSQL(“更新操作”);
这样就可以避免前面粗暴的直接将用户已有的数据删除造成的问题。

4,contentpovider

打开App,阅读手记
5人推荐
发表评论
随时随地看视频慕课网APP