前言
Sqlite是Android自带的轻量级数据库,一个项目中多多少少都会有用到数据库地方像,下载、以及做一些埋点上传等,但是自己很少从头到尾去写过数据库。这里整理一个dome记录一下包括常用的(增、删、改、查和数据库升级)。
SQLiteOpenHelper
创建数据库的帮助类具体代码如下:
//创建数据库帮助类
public class CustomSQLiteOpenHelper extends SQLiteOpenHelper{
//创建数据库名称
private static final String DATABASE_NAME = "book_store.db";
//创建版本号
private static final int DATABASE_VERSION= 1;//升级增加1
/**
*
* 默认主键自增
* 书名
* 作者
* 价格
*
*/
private static final String CREATE_TABLE = "create table bookStore("
+"id integer primary key autoincrement,"
+"book_name text,"
+"author text,"
+"price real)";
//多个参数方便在调用的时候自定义数据
public CustomSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//创建数据库使用的默认构造方法
public CustomSQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null,DATABASE_VERSION);
}
//创建数据库使用
@Override
public void onCreate(SQLiteDatabase db) {
//执行创建数据库
Log.e("TAG","执行创建数据库");
db.execSQL(CREATE_TABLE);
//升级数据库调用
}
//升级数据库使用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
通过注释可以看到这里就是创建数据库、创建表、版本号:以及升级的对应操作。真正项目中建议创建一个单例模式这样全局只存在一个对象。表创建好后对应便是增删改查这里也比较简单:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button OpenButton;
private Button SQLAdd;
private Button SQLDelete;
private Button SQLUpdate;
private Button SQLSearch;
private Button SQLSJ;
private CustomSQLiteOpenHelper customSQLiteOpenHelper;
private SQLiteDatabase writableDatabase;//对数据库具体操作(增删改查)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实现方式通过点击button去创建数据库
Init();
CreateTable();
}
private void Init() {
SQLAdd = findViewById(R.id.add);
SQLSearch = findViewById(R.id.search);
OpenButton = findViewById(R.id.button);
SQLUpdate = findViewById(R.id.updata);
SQLDelete = findViewById(R.id.delete);
// OpenButton = findViewById(R.id.button);
// OpenButton = findViewById(R.id.button);
OpenButton.setOnClickListener(this);
SQLAdd.setOnClickListener(this);
SQLSearch.setOnClickListener(this);
SQLUpdate.setOnClickListener(this);
SQLDelete.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
CreateTable();
break;
case R.id.add:
AddData();//增加数据库数据
break;
case R.id.search:
SearchData();
break;
case R.id.updata:
UpData();
Toast.makeText(MainActivity.this,"查找数据库",Toast.LENGTH_SHORT).show();
break;
case R.id.delete:
DeteteData();
break;
}
}
//创建数据库
private void CreateTable() {
customSQLiteOpenHelper = new CustomSQLiteOpenHelper(MainActivity.this);
writableDatabase = customSQLiteOpenHelper.getWritableDatabase();//通过写入是方式来创建数据库
}
//增加数据 book_name author price
private void AddData() {
writableDatabase = customSQLiteOpenHelper.getWritableDatabase();//通过写入是方式来创建数据库
ContentValues values = new ContentValues();
values.put("book_name", "《大话西游》");
values.put("author", "吴承恩");
values.put("price", "88");
writableDatabase.insert("bookStore", null, values);//增加数据库数据
}
//查找数据
private void SearchData() {
writableDatabase = customSQLiteOpenHelper.getWritableDatabase();//通过写入是方式来创建数据库
Cursor cursor = writableDatabase.rawQuery("select * from bookStore", null);
while (cursor.moveToNext()) {//去掉主键查询
int id= cursor.getInt(0);
String name = cursor.getString(1);
String author = cursor.getString(2);
double price = cursor.getInt(3);
Log.e("TAG", id+"----"+name + "----" + author + "----" + price);
}
}
//修改数据
private void UpData() {
//更新语法
writableDatabase.execSQL("UPDATE bookStore SET book_name = '《海底两万里》' WHERE id = 2;");
}
//删除某一条数据
private void DeteteData(){
writableDatabase.delete("bookStore","id=5",null);
}
}
这里比较简单基本上就只是执行对应的Sqlite语句。进行增删改查。
升级
数据库升级是会有很多种情况的:
如果只是对1.0版本的话直接通过在onCreate 中直接安装
但是用户安装APK的时候,可能是:从1.0升级到2.0也可能是直接就是安装2.0的此时考虑到:升级:通过onUpgrade方法
直接安装通过onCreate方法
如果现在有3.0的版本:此时有三种情况:
1.0-----3.0 onUpgrade方法
2.0-----3.0 onUpgrade方法
3.0 直接安装3.0 onCreate方法
1.0版本:
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_FAVORITE);
// 若不是第一个版本安装,直接执行数据库升级
// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final int FIRST_DATABASE_VERSION = 1000;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 使用for实现跨版本升级数据库
for (int i = oldVersion; i < newVersion; i++) {
switch (i) {
default:
break;
}
}
}
所以当数据库有多个版本的时候就:
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "mall.db";
private static final int DATABASE_VERSION = 1002;
private static DBHelper instance = null;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public synchronized static DBHelper getInstance(Context context) {
if (instance == null) {
instance = new DBHelper(context);
}
return instance;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_FAVORITE);
// 若不是第一个版本安装,直接执行数据库升级
// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final int FIRST_DATABASE_VERSION = 1000;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 使用for实现跨版本升级数据库
for (int i = oldVersion; i < newVersion; i++) {
switch (i) {
case 1000:
upgradeToVersion1001(db);
break;
case 1001:
upgradeToVersion1002(db);
break;
default:
break;
}
}
}
private void upgradeToVersion1001(SQLiteDatabase db){
// favorite表新增1个字段
String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN deleted VARCHAR";
db.execSQL(sql1);
}
private void upgradeToVersion1002(SQLiteDatabase db){
// favorite表新增2个字段,添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段
String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN message VARCHAR";
String sql2 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN type VARCHAR";
db.execSQL(sql1);
db.execSQL(sql2);
}
}
总结
这样的升级方式是考虑到线上存在多个版本的时候,兼容到多个版本的用户升级问题