三种方式有各自不同的使用场景,简单做下介绍。
①、文件存储
适用范围:一些简单的文本数据和二进制数据。
②、SharedPreferences存储
一般定义:为使用键值对的方式来保存存储数据,在保存一个数据的时候就对应一个键,读取的时候就根据键值把保存的数据取出来。
适用范围:键值对的数据形式,支持多种不同的数据类型存储,存储到为什么类型读取出来也是对应的数据类型。
一般定义:此为andriod系统内置的轻量级数据库,速度快占用资源少,只有几百K的内存占用,适用于移动设备上。
适用范围:一般表格类存储类型 一般数据类型 与上比比较轻便。
那么如何使用呢?
(一)sqliteOpenHelper
类是一个抽象类,使用它我们需要创建一个类去继承它:
public class NotesDB extends sqliteOpenHelper { //创建数据库 (执行一些创建表的逻辑) @Override public void onCreate(sqliteDatabase sqliteDatabase) { } //升级数据库 @Override public void onUpgrade(sqliteDatabase sqliteDatabase,int i,int i1) { } }
如代码,继承后有两个抽象方法,分别是onCreate()和onUpgrade(),这两个方法分别是创建数据库和
升级数据库的逻辑方法。
我们创建一个名为notes的表为例,看看怎么使用,如下代码为例:
/** * Created by dell on 2016/8/23. * <p/> * 数据存放/data/data/<package name>/databases目录下 */ public class NotesDB extends sqliteOpenHelper { public static final String TABLE_NAME = "notes"; public static final String CONTENT = "content"; public static final String ID = "_id"; public static final String TIME = "time"; private Context mContext; // 四个参数依次是context,数据库名字,自定义的cursor一般为null,version为版本 public NotesDB(Context context,String name,sqliteDatabase.CursorFactory factory,int version) { super(context,"notes",null,1); mContext = context; } //创建数据库 (执行一些创建表的逻辑) @Override public void onCreate(sqliteDatabase sqliteDatabase) { sqliteDatabase.execsql(CREATE_NOTES); } //升级数据库 @Override public void onUpgrade(sqliteDatabase sqliteDatabase,int i1) { } /** * 创建notes表 */ public static final String CREATE_NOTES = "create table " + TABLE_NAME + "(" + ID + " integer primary key autoincrement," + CONTENT + " text not null," + TIME + " text not null)"; }
以上都有注释,解释的很清楚,sqliteOpenHelper有两个构造方法,一般使用参数少一点的那个构造方法
即可,NotesDB构造方法接受四个参数,第一个为Context,必须有他才能进行数据库操作,第二个为数据库名称
,第三个为查询数据的时候自定义的一个返回值,一般为Null,第四个参数为当前数据库的版本号,用于对数据
进行升级操作。构建sqliteOpenHelper的实例后,在调用getReadableDatabase()或者getWritableDatabase()
方法就可以创建数据库了:
public class NotesMain extends Activity { private NotesDB notesDb; private sqliteDatabase dbWriter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mainnote); notesDb = new NotesDB(this,"notes.db",1); /** * getWritableDatabase()和getReadableDatabase()的解释: * 两个方法都可以创建或打开一个数据库, * 如果存在直接打开,否则创建一个新数据库。并返回一个可对数据库进行读写操作的对象。 * 不同的是,当数据库不可写入的时(如磁盘空间已经满了),getReadableDatabase()方法返回 * 的对象以只读的方式打开数据库,而getWritableDatabase()方法则抛出异常。 */ dbWriter = notesDb.getWritableDatabase(); addDB(); } public void addDB() { ContentValues cv = new ContentValues(); cv.put(NotesDB.CONTENT,"hello"); cv.put(NotesDB.TIME,getTime()); dbWriter.insert(NotesDB.TABLE_NAME,cv); } /** * 获取时间 * * @return */ public String getTime() { SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date curDate = new Date(); String str = format.format(curDate); return str; } }
关于sqliteOpenHelper的两个非常重要的实例方法 getWritableDatabase()和getReadableDatabase()的解释:
两个方法都可以创建或打开一个数据库,如果存在直接打开,否则创建一个新数据库。并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时(如磁盘空间已经满了),getReadableDatabase()方法返回 的对象以只读的方式打开数据库,而getWritableDatabase()方法则抛出异常。至此,运行手机程序,就可以创建了一个名叫notes的数据库了,那么具体数据库怎么查询,可以通过sqlite3来查询。二、sqlite查询创建的数据库和表信息。
使用DDMS中FILE explorer找到对应的你的程序下包名称下的数据库是可以看到文件的,但是是查询不到里边的内容的。
导出有时候会出现乱码的现象,那么在此可以使用adnroid的abd shell语言来查询。
adb是android sdk 中自带的一个调试工具,使用这个工具可以直接对连接在电脑上的手机或者模拟器进行调试
操作,他存放在sdk 的platform-tools 目录下,如果想要在命令号中使用需要配置到path变量中,方便使用。
windows配置方法:电脑-属性-高级-环境变量 找到path编辑 将platform-tools目录配置进去即可。
配置完成后 使用语言 adb shell,然后进入你的data/data/com<packagename>/databases,然后用sqlite3 加上数据库名即可打开表。
在使用.table 命令可以查看两张表,其中android_Metadata,表示每个数据库中都自动生成的,另一个notes表就是刚才新建的表。此时还
可以用.schema命令查看它的建表语句。
到此就可以证明已经确实生成了notes.db数据库库文件了。
adb shell
打开data/data/com.example.dell.myapplication/databases目录,里边就是数据库
ls查看此目录下的详细文件内容。
sqlite3 打开数据库
.table 查看被打开的数据库中的表
.schema 查看建表语句。
遇到问题:
如果打开DDMS 查看文档,在运行程序的时候可能会出现@H_404_1025@
Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
按照其提示的操作Tools -Android -Enable ADBintegration ,打勾后就可以运行了。@H_404_1025@
参考:郭霖第一行代码图书。