Android 将SQLite数据保存在SD卡
2014-11-26 10:53
260 查看
在 Android APP 的开发过程中,会用到SQLite数据库。SQLite数据保存地址在手机的内存(ROM)上,而手机的内容有限,所以直接保存在SD卡上比较好,这样在app重新安装,或者重做系统时可以再次使用。本文章介绍如何将SQLite数据库文件保存到SD卡上。
SQLite数据库默认的存储路径为:/data/data/${packagename}/database,${packagename}是应用的包名。
该种方式建立的数据库只有本程序可以访问,其他的应用程序是无法访问的,而且没有经过root的手机,用户是无法手动删除该数据库文件的。
该数据库文件一旦建立,便是常驻于内存的(只有当应用程序被卸载时,才会被删除),如果数据库文件比较大时,会占用手机很大内存。于是就想着把数据库文件建在SDCard上,放在SDCard上的优点是不影响内存,而且就算程序被卸载,再重装时,数据也不会丢失。下面讲讲怎么把数据库建在SDCard上:
之前也找过很多资料,大致上的意思,就是继承SQLiteOpenHelper类,然后重写其中的getWritableDatabase方法,在里面调用SQLiteDatabase.openOrCreateDatabase(file,null)方法,其中file即是数据库文件在SDCard上的文件名称。这种方法确实可以在SDCard上建立数据库文件,但是问题是如果在查询数据库时,可能不需要写权限,只需要读权限,就需要调用getReadableDatabase方法,所以又必须要重写这个方法。更重要的是,重写的这些方法并不是线程安全的,SQLiteOpenHelper类中的这两个方法在调用时是做了一系列的加锁处理的,重写之后这些代码便不起作用了,容易导致错误,如果全部挪过来的话就太复杂了。
废话说了一箩筐,终于上正题了。其实查看framework中SQLiteOpenHelper的源码可以发现,在getWritableDatabase中会也是会调用openOrCreateDatabase方法的,其中的file参数值是在该类的构造器中传入的,而在继承SQLiteOpenHelper类时,也是必须要实现构造器的,在构造器中还必须调用父类的构造器,因此,可以在SQLiteOpenHelper子类中传入放在SDCard上的数据库文件(如/sdcard/database/db.db),但是前提是必须要先建立数据库文件的父文件夹(/sdcard/database),否则会抛出异常。具体代码如下:
仅此而已,其他的调用方法都不受任何影响,是不是很简单方便......
SQLite数据库默认的存储路径为:/data/data/${packagename}/database,${packagename}是应用的包名。
该种方式建立的数据库只有本程序可以访问,其他的应用程序是无法访问的,而且没有经过root的手机,用户是无法手动删除该数据库文件的。
该数据库文件一旦建立,便是常驻于内存的(只有当应用程序被卸载时,才会被删除),如果数据库文件比较大时,会占用手机很大内存。于是就想着把数据库文件建在SDCard上,放在SDCard上的优点是不影响内存,而且就算程序被卸载,再重装时,数据也不会丢失。下面讲讲怎么把数据库建在SDCard上:
之前也找过很多资料,大致上的意思,就是继承SQLiteOpenHelper类,然后重写其中的getWritableDatabase方法,在里面调用SQLiteDatabase.openOrCreateDatabase(file,null)方法,其中file即是数据库文件在SDCard上的文件名称。这种方法确实可以在SDCard上建立数据库文件,但是问题是如果在查询数据库时,可能不需要写权限,只需要读权限,就需要调用getReadableDatabase方法,所以又必须要重写这个方法。更重要的是,重写的这些方法并不是线程安全的,SQLiteOpenHelper类中的这两个方法在调用时是做了一系列的加锁处理的,重写之后这些代码便不起作用了,容易导致错误,如果全部挪过来的话就太复杂了。
废话说了一箩筐,终于上正题了。其实查看framework中SQLiteOpenHelper的源码可以发现,在getWritableDatabase中会也是会调用openOrCreateDatabase方法的,其中的file参数值是在该类的构造器中传入的,而在继承SQLiteOpenHelper类时,也是必须要实现构造器的,在构造器中还必须调用父类的构造器,因此,可以在SQLiteOpenHelper子类中传入放在SDCard上的数据库文件(如/sdcard/database/db.db),但是前提是必须要先建立数据库文件的父文件夹(/sdcard/database),否则会抛出异常。具体代码如下:
public class BaseMsgDbHelper extends SQLiteOpenHelper { public static finalString DB_NAME = "db.db"; public static final intVERSION = 1; publicBaseMsgDbHelper(Context context) { super(context, getMyDatabaseName(context), null,VERSION); } privatestatic String getMyDatabaseName(Context context){ String databasename = DB_NAME; boolean isSdcardEnable =false; String state =Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(state)){//SDCard是否插入 isSdcardEnable = true; } String dbPath = null; if(isSdcardEnable){ dbPath =Environment.getExternalStorageDirectory().getPath() +"/database/"; }else{//未插入SDCard,建在内存中 dbPath =context.getFilesDir().getPath() + "/database/"; } File dbp = newFile(dbPath); if(!dbp.exists()){ dbp.mkdirs(); } databasename = dbPath +DB_NAME; return databasename; } }
仅此而已,其他的调用方法都不受任何影响,是不是很简单方便......
相关文章推荐
- Android游戏开发13:SQLite存储数据及保存SQLite数据库文件到SD卡
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- (转)【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- android应用面试宝典(上);公共基类管理公共头尾页;公共activity的参数问题;SQLite存数据;前提先将txt数据保存在项目的assets文件下;
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- Android开发 将数据保存到SD卡
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 【android, 3】3.操作数据保存到rom,sd卡上,sharedpreference的使用,pul解析xml
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- Android android下的数据持久化和读取数据,保存数据到手机及SD卡
- android---数据保存之SQLite(实现登录用户信息保存
- (转)【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!