标签:
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{ } }
标签:
原文地址:http://www.cnblogs.com/QuietZhi/p/4642620.html