码迷,mamicode.com
首页 > 移动开发 > 详细

Android的4中数据存储方式

时间:2015-07-13 13:53:54      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

Android的4中数据存储方式:
1.SharedPreference
2.SQLite
3.ContentProvider
4.File

 

1.SharedPreference
1)轻量级数据存储方式A
2)本质是基于XML文件存储key-value键值对数据
3)用于保存应用程序的 参数/属性的配置信息
SharedPreference对象本身只能获取数据而不支持存储和修改,修改是通过Editor来实现
实现SharedPreference存储的步骤:
(1)获得SharedPreference对象
SharedPreferences pref = getSharedPreferences("MyPref",MODE_PRIVATE);
第一个参数为要存储的xml文件名字,第二个为文件访问模式
(2)获得SharedPreference.Editor对象
Editor editor = pref.edit();
(3)通过Editor接口的putXxx方法,保存key-value,其中Xxx为不同的数据类型
editor.putString("name", "zhang3");
editor.putInt("age", 18);
editor.putLong("time", System.currentTimeMillis());
editor.putBoolean("default", true);
第一个参数用于指定索要读取信息的键名
第二个参数为键指定默认的缺省值。XML中午指定键,则此缺省值作为方法返回值
(4)通过Editor接口的commit方法保存key-value值
editor.commit();//每次commit之后才生效
获取数据
String name = pref.getString("name", "aaa");
同理其他数据类型
SharedPreference的小项目(供学习参考)

2.SQLite
C语言写的开源嵌入式数据库引擎。支持大多数的SQL92标准。
主要特点:1.轻量级 一个动态库、单文件
2.独立性 没有依赖、无需安装
3.隔离性 全部在一个文件夹中
4.跨平台 支持众多操作系统
5.多语言接口 支持众多编程语言
6.安全性 事务
关于事务处理的安全性问题:
--通过数据库上的独占性和共享锁来实现独立事务处理
--多个进程可以在同一时间同一数据库读取数据,但只有一个可以写入数据。


SQLite的数据类型:
----SQLite支持NULL(空值) INTEGER(整型值)
REAL(浮点值)TEXT(字符串值)
BLOB(二进制)
SQLite动态数据类型(弱引用)
----当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会
将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
注意:
1.没有可用于SQLite的网络服务器、只能通过网络共享可能存在的文件锁定或者性能问题。
2.只提供数据库级别的锁定
3.没有用户账户概念,而是根据文件系统确定所有数据库的权限。
在Android中使用SQLite:(SQLiteDatabase和SQLiteOpenHelper)
1).SQLiteDatabase:
--提供了一些管理SQLite数据库的类
--提供创建,删除,执行SQL命令,并执行其他常见的数据库管理任务的方法
--每个程序的数据库名字是唯一的
提供的常用的方法:
db.execSQL(sql)//执行任何SQL语句
db.insert(table,nullColumnHack,values)
db.delete(table,whereClause,whereArgs)
db.update(table,values,whereClause,whereArgs)
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy)
db.rawQuery(sql,selectionArgs)
在数据库中存入数据,以下是第一种方法:不常用,较麻烦
在onCreate函数里添加如下代码:

//每个程序都有自己的数据库,默认情况下是各自互相不干扰
//创建一个数据库,并且打开
/* 第一个参数:数据库名字
 * 第二个参数:数据库访问权限
 * 第三个参数:游标实例化工厂类,可以不需要
 */
SQLiteDatabase db = openOrCreateDatabase("user.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement,name text not null,age integer not null,sex text not null)");
db.execSQL("insert into usertb(name,sex,age)values(‘张三‘,‘女‘,18)");
db.execSQL("insert into usertb(name,sex,age)values(‘李四‘,‘女‘,20)");
db.execSQL("insert into usertb(name,sex,age)values(‘王五‘,‘男‘,33)");
		
Cursor c = db.rawQuery("select * from usertb", null);
if(c!=null){
	while(c.moveToNext()){
		Log.i("info","_id"+c.getInt(c.getColumnIndex("_id")));
		Log.i("info","name"+c.getString(c.getColumnIndex("name")));
		Log.i("info","age"+c.getInt(c.getColumnIndex("age")));
		Log.i("info","sex"+c.getString(c.getColumnIndex("sex")));
		Log.i("info","!!!!!!!!!!!!!!!!!!!!!!!!!!!1");
	}
	c.close();
}
db.close();

以上是添加数据并查询数据并在log中打印输出信息
注:
Cursor是Android查询数据后得到的一个管理数据集合的类,若查询得到的数据量较小,不会有内存
问题,而且虚拟机会保证Cursor最终会被释放掉。若Cursor数据量特别大,尤其是里边有Blob信息时,应该
保证Cursor占用的内存被及时释放掉即close

第二种方法:
ContentValues:
--这个类是用来存储一组可以被ContentResolver处理的值。
ContentValues values = new ContentValues();
//类似hashMap key value
values.put("name","张三");
在onCreate函数里添加如下代码:

SQLiteDatabase db = openOrCreateDatabase("stu.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement,name text not null,age integer not null,sex text not null)");
ContentValues values = new ContentValues();
values.put("name","张三");
values.put("age",44);
values.put("sex","男");
db.insert("str.db",null,values);
values.clear();
values.put("name","李四");
values.put("age",22);
values.put("sex","男");
db.insert("str.db",null,values);
values.clear();
values.put("name","王五");
values.put("age",22);
values.put("sex","男");
db.insert("str.db",null,values);
values.clear();
//更新
values.put("sex","女")
db.update("stutb",values,"_id>?",new String[]{"2"});//将id>2的性别更改为女
db.delete("stutb","name like ?",new String[]{"%五%"});//删除名字中所有带有五的记录
Cursor c = db.query("stutb",null,"_id>?",new String[]{"0"},null,null,"name");//查询所有按名字排序
if(c!=null){
	String[]columns =c.getColumnNames();
	while(c.moveToNext()){
		for(String columnName : columns){
			Log.i("info",c.getString(c.getColumnIndex(columnname)));
		}
	}
	c.close();
}
db.close();

2).SQLiteOpenHelper
--SQLiteDatabases的帮助类,用于管理数据库的创建和版本更新
--一般是建立一个类继承,并重写onCreate()和onUpgrade()方法
--方法说明:
...onCreate(SQLiteDatabase db) 创建数据库时调用
...onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 版本更新时调用
...getReadableDatabase() 创建或打开一个只读数据库
...getWritableDatabase() 创建或打开一个读写数据库

新建一个类继承SQLiteOpenHelper,并重写onCreate,onUpgrade,和构造器

public DBOpenHelper(Context context, String name) {
super(context, name, null, 1);
		
}
@Override//首次创建数据库的时候调用,一般写建库建表的操作
public void onCreate(SQLiteDatabase db) {
	db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,age integer not null,sex text not null)");
	db.execSQL("insert into stutb(name,sex,age)values(‘张三‘,‘女‘,17)");
}

@Override//数据库版本更新时自行调用
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	// TODO Auto-generated method stub
		
}
//然后再MainActivity里修改onCreate函数
DBOpenHelper  helper=  new DBOpenHelper(MainActivity.this, "stu.db");
//helper.getReadableDatabase();//获取一个只读数据库,只能查询,不能写入,不能更新
SQLiteDatabase db = helper.getWritableDatabase();
//db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
Cursor c = db.rawQuery("select * from stutb",null);
if(c!=null){
	String[]columns =c.getColumnNames();
	while(c.moveToNext()){
		for(String columnName : columns){
			Log.i("info",c.getString(c.getColumnIndex(columnName)));
		}
	}
	c.close();
}
db.close();

3.ContentProvider
查看ContentProvider
4.File
Android系统可通过流来访问文件,支持文件流的包装,但是只允许对一下文件进行读写访问
--Android Linux系统中的"/data/data/com.xxx.xx(所属应用程序包)"
--SD卡中"/sdcard"
Activity中提供一下方法获取文件流:
--openFileOutput---该方法返回指定文件的输出流
--openFileInput---返回指定文件的输入流
还有一些其他文件操作方法:
--fileList()---获取私有目录下所有文件名的数组列表
--getFilesDir()---获取该Activity所属文件路径的File对象
--deleteFile(String name)---删除指定文件

FileoutputStream openFileOutput(string name,int mode)
--第一个参数为打开的文件名
--第二个参数为指定文件的访问模式

MODE_APPEND--打开文件并在文件末尾添加
MODE_PRIVATE--以仅供应用程序自己读写的私有方式打开文件
MODE_WORLD_READABLE--以可提供其他应用程序读取的方式打开文件
MODE_WORLD_WRITABLE--以可提供其他应用程序写入的方式打开文件

文件输出流写入数据示例代码:

private void writeTextFile(String filename,string text) whrows IOException{
	FileOutputStream fos = null;
	BufferedOutputStream bos = null;

	try{
		fos = openFileOutput(filename,MODE_PRIVATE);
		bos = new BufferedOutputStream(fos);
		bos.write(text.getBytes("UTF-8"))
	}finally{
		try{
			if(bos!=null)bos.close();
		}catch(IOException e){}

		try{
			if(fos!=null)fos.close();
		}catch(IOException e){}
	}
}
//文件输入流读取数据示例代码:
private String readTextFile(String filename)throws IOException{
	FileInputStream fis = null;
	BufferedInputStream bis = null;

	try{
		fis = openFileInput(filename);
		bis = new BufferredInputStream(fis);

		String realPath=this.getFilesDir().getPath().toString()+"/";
		File file = new File(realPath+ filename);
		byte[] buf = new byte[(int)file.length()];
		bis.read(buf);
	}finally{
	
	}
}

  

  

  

  

Android的4中数据存储方式

标签:

原文地址:http://www.cnblogs.com/QuietZhi/p/4642620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!