连接上一篇:Android数据存储总结之一


三、数据库保存


Android使用的数据库为SQLite,此数据库的特点是小巧,没有系统进程,只需要几百K的内存就可以跑起来,ISO和Android都使用的这个。数据库存储的数据类型有:

1、NULL,值是NULL
2、INTEGER,值是有符号整形,根据值的大小以1,2,3,4,6或8字节存放
3、REAL,值是浮点型值,以8字节IEEE浮点数存放
4、TEXT,值是文本字符串,使用数据库编码(UTF-8,UTF-16BE或者UTF-16LE)存放
5、BLOB,只是一个数据块,完全按照输入存放(即没有准换)

不过该类型不是刚性的,也就是说虽然可以指定数据类型,不过也可以存储不是指定类型的数据到里面。

Android有一个专门的类用来提供创建和操作数据库:sqliteOpenHelper


示例:

public class MySqliteOpenHelper extends SQLiteOpenHelper {private String TAG = "MyDataBase";private Context context;private final String NAME = "";private int VERSION = 1;private String table_name = "";private SQLiteDatabase db;public MySqliteOpenHelper(Context context, String name, CursorFactory factory, int version) {super(context, name, factory, version);this.context = context;this.VERSION = version;}@Overridepublic void onCreate(SQLiteDatabase db) {db.openOrCreateDatabase(NAME, null);this.db = db;}// 执行sql语句,成功执行返回truepublic boolean execSQl(String sql) {boolean flag = false;if (sql != null && sql.length() > 3) {judgeDB();db.execSQL(sql);flag = true;}return flag;}// 添加数据public void insert(String table, String hack, ContentValues values) {judgeDB();db.insert(table, hack, values);close();}// 更新数据public void update(String table, ContentValues values, String whereClause, String[] whereArgs) {judgeDB();db.update(table, values, whereClause, whereArgs);close();}// 删除数据public void delete(String table, String whereClause, String[] whereArgs) {judgeDB();db.delete(table, whereClause, whereArgs);close();}// 查询数据public Cursor select(String sql, String[] selectionArgs) {judgeDB();return db.rawQuery(sql, selectionArgs);}// 关闭数据库public void close() {if (db.isOpen())db.close();}// 数据库是否处于打开状态,不处于就打开数据库private void judgeDB() {if (!db.isOpen())db.openDatabase(NAME, null, SQLiteDatabase.OPEN_READWRITE);}@Overridepublic void onOpen(SQLiteDatabase db) {super.onOpen(db);Log.e(TAG, "数据库被打开了");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.e(TAG, "表更新了");// if (newVersion > oldVersion)// db.execSQL("alter table " + NAME + " add ");}}
在执行增删改查操作的时候,可以直接使用SqliteDatabase封装好的方法,也可以使用sql命令去执行。

四、网络保存


Android也可以把数据保存到服务器上面或者别的什么介质,比如自己搭建一个servlet服务器,然后使用http协议用post的方式把数据上传到服务器上面,再比如使用第三方的软件,如百度云、360网盘等把数据上传到别的公司的服务器上面。这种方式保存数据的优点就是存储容量可以说是无限大,缺点就是必须要有网络才能下载数据。


五、ContentProvider



为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。安卓自身的内容提供都是基于这个,比如联系人,短信,通话记录等。




使用步骤:

1、编写一个类,继承ContentProvider类;

2、实现ContentProvider类中所有的抽象方法;

3、定义ContentProvider的Uri。这个Uri是ContentResolver对象执行CRUD(增删改查)操作时重要的参数;

4、使用UriMatcher对象映射Uri返回代码;

5、在AndroidMainfest.xml文件中使用<provider>标签注册ContentProvider。



ContentProvider类中六个抽象方法:

1、onCreate() 初始化provider

2、query() 返回数据给调用者

3、insert() 插入新数据到ContentProvider

4、update() 更新ContentProvider已经存在的数据

5、delete() 从ContentProvider中删除数据

6、getType() 返回ContentProvider数据的Mime类型



核心代码示例:

publicclass MyWordsProvider extends ContentProvider {private MySQLiteOpenHelper dbHelper = null;private SQLiteDatabase db = null;privatestatic UriMatcher matcher = null;privatestaticfinal String AUTHORITY = "com.xinxue.contentprovider";static {matcher = new UriMatcher(UriMatcher.NO_MATCH);matcher.addURI(AUTHORITY, "words", 1);matcher.addURI(AUTHORITY, "newwords", 2);}@Overridepublicboolean onCreate() {dbHelper = new MySQLiteOpenHelper(getContext());db = dbHelper.getReadableDatabase();return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {switch (matcher.match(uri)) {case 1:Cursor cursor = db.query("tb_words", projection, selection,selectionArgs, null, null, sortOrder);return cursor;case 2:Cursor cursor2 = db.query("tb_newwords", projection, selection,selectionArgs, null, null, sortOrder);return cursor2;default:break;}returnnull;}@Overridepublic String getType(Uri uri) {returnnull;}@Overridepublic Uri insert(Uri uri, ContentValues values) {long rowId = 0;switch (matcher.match(uri)) {case 1:rowId = db.insert("tb_words", null, values);if (rowId > 0) {Uri newUri = ContentUris.withAppendedId(Uri.parse("content://" + AUTHORITY + "/words"), rowId);// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(newUri, null);return newUri;}break;case 2:rowId = db.insert("tb_newwords", null, values);if (rowId > 0) {Uri newUri = ContentUris.withAppendedId(Uri.parse("content://" + AUTHORITY + "/newwords"),rowId);// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(newUri, null);return newUri;}break;default:break;}returnnull;}@Overridepublicint delete(Uri uri, String selection, String[] selectionArgs) {switch (matcher.match(uri)) {case 1:int count = db.delete("tb_words", selection, selectionArgs);if (count > 0) {// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(uri, null);}return count;case 2:int count2 = db.delete("tb_newwords", selection, selectionArgs);if (count2 > 0) {// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(uri, null);}return count2;default:break;}return 0;}@Overridepublicint update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {switch (matcher.match(uri)) {case 1:int count = db.update("tb_words", values, selection, selectionArgs);if (count > 0) {// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(uri, null);}return count;case 2:int count2 = db.update("tb_newwords", values, selection,selectionArgs);if (count2 > 0) {// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(uri, null);}return count2;default:break;}return 0;}}


到这里安卓数据存储的总结已经写完了,限于目前的水平,写的可能不是很清楚,中间大家有什么没弄明白的可以单独针对某个知识点深入学习一下,希望我写的这些知识能对你的学习有所帮助,文中有什么错误的地方欢迎指正,另外如果有什么建议也欢迎给我留言或者发我邮箱:[email protected],谢谢~~~~~~~~~~



更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android采用SharedPreferences方式进行文件的保存与读取
  5. Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录
  6. Android(安卓)Native C++ 层中使用AudioRecord录制PCM音频
  7. Android_MVC模式
  8. Android(安卓)Java Framework显示Toast(无Activity和Service)
  9. android Asynctask的优缺点?能否同时并发100+asynctask呢?

随机推荐

  1. FireMonkey支持的机型
  2. GridLayout 使用总结
  3. 用gradle 来打包Android
  4. 【Android】Android中 Paint 字体、粗细
  5. Android知识体系总结(全方面覆盖Android知
  6. A-GPS定位与GPS定位的Android简单实现
  7. android 学习笔记1
  8. Android编译环境
  9. 搭建Android java开发环境 eclipse
  10. 关于Android的prelink(Linux)