- 文件存储
Android系统下的文件分为两类:一类是共享文件,如存储在SD卡上的文件,这种文件任何的Android应用都可以访问;另一类是私有文件,即Android应
用自己创建的文件。Android中对文件的读写与javaSE的文件读写一样,都是采用IO流。但是对于私有文件,只有具有访问权限的用户才能使用,因此,Android提供了一组特有的API来完成对私有文件的读写。
即 Context类中提供的
FileInputStream openFileInput(String name)和
FileOutputStream openFileOutput(String name,int mode)方法
,获取文件输出流或者文件输入流,之后就是利用 Java 的各种流来进行读写操作就可以了。其中参数mode,即对文件的操作模式。
- 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
共同学习,写下你的评论
评论加载中...
作者其他优质文章