时间:2016年10月29日
安卓的内置SQlite数据库是一款轻量级的数据库,简便实用,话不多说,说出我的一点理解。
在前几天,我想实现在不同的activity中存入同一个数据表中,并且将数据显示出来,开始的时候经过实验,发现每次存入都会申请一个数据库,并且点击一次存储一次,并不会存入一个数据表中,经过老师的点拨,发现应该使用数据库的单例模式,简而言之,就是一个类只允许实例化一次,工具类只会实例化一次,减少了很多麻烦的事情。
**
* Created by DELL on 2016/10/28.
*/
public class shopOpenhelpSQL extends SQLiteOpenHelper {
private static final String db_name = “shop_save”; //定义数据库名称
private String tb_name = “shop_table”; //定义数据表名称
private static final int version = 1; //定义版本号
private static shopOpenhelpSQL open;
SQLiteDatabase db; //数据库对象
private shopOpenhelpSQL(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)// 构造函数
{
super(context, db_name, null, version);
}
public static shopOpenhelpSQL getInstance(Context context){
if (open==null){
open=new shopOpenhelpSQL(context,db_name,null,1);
}
return open;
}
//创建数据表
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE IF NOT EXISTS " +
tb_name +
"(name VARCHAR(30), " +
"phone VARCHAR(10), " +
"shop_name VARCHAR(10))";
db.execSQL(createTable);
}
//版本升级使用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
db.execSQL("DROP TABLE IF EXISTS[shop_table]");
} else {
return;
}
onCreate(db);
}
}
代码解析:首先继承SQLiteOpenHelper类,这是SQLite数据库自带的数据库辅助类,继承之后需要重写onCreate函数(建立数据表的函数)和onUpgrade函数(数据库版本升级之后调用的函数)。
上面的代码段,首先是写了构造函数shopOpenhelpSQL(Context context, String name, SQLiteDatabase.CursorFactory factory, int version),
解析:String name 是数据库的名称。CursorFactory factory是工厂类,一般设为null,int version是定义的版本号。
public static shopOpenhelpSQL getInstance(Context context){}
下面是第一个页面添加的数据 MainActivity
shopOpenhelpSQL data=shopOpenhelpSQL.getInstance(MainActivity.this);
SQLiteDatabase db=data.getWritableDatabase();
ContentValues cv=new ContentValues(2);
cv.put(“name”,surname);
cv.put(“phone”,phone);
db.insert(“shop_table”,null,cv);
下面是第二个页面添加的数据SencentActivity
shopOpenhelpSQL data=shopOpenhelpSQL.getInstance(SencentActivity.this); //得到实例化的数据库对象
SQLiteDatabase db=data.getWritableDatabase(); //得到写入的权限
ContentValues cv=new ContentValues(1); //申请ContentValue对象
cv.put(“shop_name”,name_0); //标记name_0为 shop_name
db.insert(“shop_table”,null,cv); //向数据表中添加数据
但对于数据库有些别扭或者说比较难理解的地方,你建立的是数据库类,当你使用单例模式的时候,实例化一次数据库,添加数据表可以很多次,但是当你在不同的activity向数据表中添加数据的时候,它会把不同页面的数据分为不同的行。像上面的例子,我数据表建立的有三个数据分别是name,phone和shop_name,但我在第一个页面中向它添加了name和phone,在第二个页面向数据表中添加shop_name,出现的结果我使用了Stetho查看,是这样的。