Android数据的四种存储方式

作为一个完整的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:

   1 SharePreference

   2 SQLite

   3 Content  Provider

   4 File

由于Android系统中,数据基本都是私有的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content  Provider。

SQLite:

SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。

SQlite -- ANDROID数据库编程

sqlite是D.Richard Hipp用C语言编写的一款开源的轻量级嵌入式数据库,但比起前面几种存储数据方式确实重量级的。

它具有很多优点,比如:

1.轻量级

不同于sql server,oracle,mysql的c/s模式,这个数据库不存在客户端、服务器,只需要呆上他的一个动态库,就可以使用全部功能,是一个是进程内的数据库引擎。尺寸相当小。

2.独立性

数据库的核心引擎不需要第三方支持,也不需要安装此数据库。部署节约时间。

3.隔离性

sqlite数据库的所有内容(表、试图、触发器等)都包含在一个文件内,方便管理。

4.跨平台

pc上的系统外,Android、window mobile、sybian、palm等都可以使用。

5.多语言接口

支持主流的编程语言,c/c++,java,python,.net,ruby,perl等。

6.安全性

对于sqlite数据库的访问机制使用了共享锁和独占锁机制,同一时间,只能由占用独占锁的应用访问读写数据。其他进程不能执行读写操作,这就避免了类似读脏数据之类的不安全事件。

想了解sqlite更多情况请访问官网:http://www.sqlite.org

下面是在android平台数据库操作的详细代码:

[java]  view plain copy
  1. // 创建和打开数据库  
  2. SQLiteDatabase mSQLiteDatabase = this.openOrCreateDatabase("dbname.db", MODE_PRIVATE, null);  
  3. // 使用sql语句创建表  
  4. string sql_create_db = “CREATE TABLE table_name(_id INTEGER PRIMARY KEY, num INTEGER, data TEXT)";  
  5. mSQLiteDatabase.exeSQL(CREATE_TABLE);  
  6.   
  7. // 向表里添加数据(2种方法)  
  8. // 1.使用ContentValues  
  9. ContantValues cv = new ContantValues();  
  10. cv.put(TABLE_NUM, 1); // 插入字段名TABLE_NUM自定义  
  11. cv.put(TABLE_DATA, "test"); // 字段名TABLE_DATA自定义  
  12. mSQLiteDatabase.insert(TABLE_NAME, null, cv);  
  13. // 2.使用sql语句  
  14. string sql_insert = "INSERT INTO tablename(_id, num, data) values(1, 1, 'test')";  
  15.   
  16. // 删除数据  
  17. string sql_delete ="DELETE FROM tablename WHERE _id=1";  
  18. mSQLiteDatabase.execSQL(sql_delete);  
  19.   
  20. // 修改表中的数据  
  21. ContentValues cv = new ContentValues();  
  22. cv.put(TABLE_NUM, 1); // 修改字段为TABLE_NUM的数据   
  23. cv.put(TABLE_DATA, "ceshi"): // 修改字段为TABLE_DATA的数据  
  24.   
  25. mSQLiteDatabase.update("tablename", cv, "num " + "=" + Integer.toString(0), null);  
  26. // 关闭数据库  
  27. mSQLiteDatabase.close();  
  28. // 删除指定表  
  29. mSQLiteDatabase.execSQL("DROP TABLE tablename");  
  30. // 删除数据库  
  31. mSQLiteDatabase.deleteDatabase("databasename.db");  
  32.   
  33. // 查询表中的数据,这里给出一段代码  
  34. // 使用Cursor对象查询数据  
  35. Cursor cursor = mSQLiteDatabase.rawQuery("select * from table"null);  
  36. if(cursor != null){  
  37.      if(cursor.moveToFirst()){  
  38.            do{  
  39.                  int numColumn = cursor.getColumnIndex("num");  
  40.                  int num = cursor.getInt(numColumn);  
  41.            }while(cursor.moveToNext());  
  42.      }  
  43. }  
  44.    

扩展学习:

数据库文件仍然在/data/data/<package_name>/的database目录下。

 有时会把这些方法封装成一个类用于通用编程,这个类一般叫SQLiteOpenHelper。明天附上一份代码。

 

[java]  view plain copy
  1. package mars.Activity16.db;  
  2.   
  3. import android.content.ContentValues;  
  4. import android.content.Context;  
  5. import android.database.Cursor;  
  6. import android.database.SQLException;  
  7. import android.database.sqlite.SQLiteDatabase;  
  8. import android.database.sqlite.SQLiteOpenHelper;  
  9.   
  10. public class MyDatabaseAdapter {  
  11.   
  12.     // 打印的log  
  13.     private static final String TAG = "MyDatabaseAdapter";  
  14.     // 表中的一个字段名  
  15.     public static final String KEY_ID = "_id";  
  16.     // 编号  
  17.     public static final String KEY_NUM = "num";  
  18.     // 另一个字段名  
  19.     public static final String KEY_DATA = "data";  
  20.     // 数据库名称  
  21.     public static final String DB_NAME = "Example.db";  
  22.     // 数据表名  
  23.     public static final String DB_TABLE_NAME = "table_name";  
  24.     // 版本号  
  25.     public static final int DB_VERSION = 1;  
  26.     // 建表的sql语句  
  27.     public static final String DB_CREATE_SQL = "CREATE TABLE "  
  28.             + DB_TABLE_NAME + " ("   
  29.             + KEY_ID +" INTEGER PRIMARY KEY,"   
  30.             + KEY_NUM +" INTEGER,"  
  31.             + KEY_DATA + " TEXT)";  
  32.       
  33.     // 本类中要使用的Context  
  34.     Context mContext = null;  
  35.       
  36.     // 执行open()打开数据库时,保存返回的数据库对象  
  37.     private SQLiteDatabase mSQLiteDatabase = null;  
  38.     // 再声明一个继承自SQLiteOpenHelper对象  
  39.     private DatabaseHelper mDatabaseHelper = null;  
  40.       
  41.     // 构造  
  42.     public MyDatabaseAdapter(Context context){  
  43.         mContext = context;  
  44.     }  
  45.       
  46.     // 打开数据库  
  47.     public void open() throws SQLException{  
  48.         mDatabaseHelper = new DatabaseHelper(mContext);  
  49.         mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();  
  50.     }  
  51.       
  52.     // 关闭数据库  
  53.     public void close(){  
  54.         mDatabaseHelper.close();  
  55.     }  
  56.       
  57.     // 插入一条数据  
  58.     public long insertData(int num, String data){  
  59.         ContentValues initialValues = new ContentValues();  
  60.         initialValues.put(KEY_NUM, num);  
  61.         initialValues.put(KEY_DATA, data);  
  62.         return mSQLiteDatabase.insert(DB_TABLE_NAME, KEY_ID, initialValues);  
  63.     }  
  64.       
  65.     // 删除一条数据  
  66.     public boolean deleteData(long rowId){  
  67.         return mSQLiteDatabase.delete(DB_TABLE_NAME, KEY_ID+"="+rowId, null) > 0;  
  68.     }  
  69.       
  70.     // 通过Cursor查询所有数据  
  71.     public Cursor fetchAllData(){  
  72.         return mSQLiteDatabase.query(DB_TABLE_NAME, new String[]{KEY_ID, KEY_DATA}, nullnullnullnullnull);    
  73.     }  
  74.       
  75.     // 查询指定数据  
  76.     public Cursor fetchData(long rowId) throws SQLException{  
  77.         Cursor mCursor = mSQLiteDatabase.query(true, DB_TABLE_NAME, new String[]{KEY_ID, KEY_DATA}, KEY_ID+"="+rowId, nullnullnullnullnull);      
  78.         if(mCursor != null){  
  79.             mCursor.moveToFirst();  
  80.         }  
  81.         return mCursor;  
  82.     }  
  83.       
  84.     // 更新一条数据  
  85.     public boolean updateData(long rowId, int num, String data){  
  86.         ContentValues values = new ContentValues();  
  87.         values.put(KEY_NUM, num);  
  88.         values.put(KEY_DATA, data);  
  89.         return (mSQLiteDatabase.update(DB_TABLE_NAME, values, KEY_ID+"="+rowId, null) > 0);  
  90.     }  
  91.       
  92.     // 自定义内部类,用于简化SQLiteOpenHelper对象的使用  
  93.     private static class DatabaseHelper extends SQLiteOpenHelper{  
  94.   
  95.   
  96.         public DatabaseHelper(Context mContext) {  
  97.             // TODO Auto-generated constructor stub  
  98.             super(mContext, DB_NAME, null, DB_VERSION);  
  99.         }  
  100.   
  101.         @Override  
  102.         public void onCreate(SQLiteDatabase db) {  
  103.             // TODO Auto-generated method stub  
  104.             db.execSQL(DB_CREATE_SQL);  
  105.         }  
  106.   
  107.         // 升级数据库  
  108.         @Override  
  109.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  110.             // TODO Auto-generated method stub  
  111.             db.execSQL("DROP TABLE IF EXISTS notes");  
  112.             onCreate(db);  
  113.         }  
  114.     }  
  115. }  

SharedPreference:

除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。

[java]  view plain copy
  1. boolean mbMusic = false;  
  2. SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE); // 获取Preferences对象。  
  3. sharedPreferences.Editor editor = settings.editor(); //编辑对象  
  4. mbMusic = editor.getBoolean("bmusic"); // 获得值   
  5. editor.putBoolean("bmusic", mbMusic); // 添加值  

扩展学习:

这些数据会保存在/data/data目录下的应用程序的shared_prefs文件夹的一个xml文件。


File:

即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

学过java的应该懂的!!! ~

[java]  view plain copy
  1. boolean mbMusic = false;  
  2.   
  3. Properties properties = new Properties(); // 构建Properties对象  
  4.   
  5. FileInputStream stream  = this.openFileInput("music.cfg"); // 打开文件,形成文件输入流  
  6.   
  7. // 读取数据  
  8.   
  9. properties.load(stream); // 读取文件  
  10.   
  11. mbMusic = boolean.valueOf(Properties.get("bmusic").toString());  
  12.   
  13. // 保存数据  
  14.   
  15. properties.put("bmusic", String.valueOf(mbmusic)); // 把一个数据打包成properties  
  16.   
  17. FileOutputStream stream = this.openFileOutput("music.cfg", Context.MODE_WORLD_WRITEABLE);  
  18.   
  19. properties.store(stream,"");// 存入文件中  
  20.   
  21.    

扩展学习:

如果文件保存在SD卡上,注意配置AndroidMainifest.xml中的权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

默认状态下文件是不能在应用程序之间共享的。通过load()方法可以打开文件,通过deleteFile方法可以删除指定的文件。

即使使用绝对路径也不可以实现应用程序共享文件。

默认文件会保存在/data/data目录下的应用程序的shared_prefs文件夹的的files文件夹下。

另外如果需要初始化应用程序时加载一个文件也可以在res/raw/tempFile中建立一个static文件,通过Resources.openRawResource(R.raw.文件名)同样返回一个InputStream对象,读取文件内容。


ContentProvider:

Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个ContentProvider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用ContentProvider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。


转自百度经验

摘抄自http://blog.csdn.net/cdkd123/article/details/7865139

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值