转载请标明出处:
https://blog.youkuaiyun.com/m0_38074457/article/details/88368367
1、SQLite数据是在SQLiteOpenHelper中创建和迭代更新的;
2、创建类MySQLiteOpenHelper继承SQLiteOpenHelper,构造方法中进行初始化;
//数据库名
private static final String DATABASE_NAME = "sqlite_iteration.db";
//表名
public static final String TABLE_NAME = "tabledemo";
//当前数据库版本,当数据库升级时,需要把版本对应进行升高
public static final int DATABASE_VERSION = 2;
public MySQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
3、实现onCreate方法,方法中进行数据库初始化操作,并调用onUpgrade方法实现版本迭代;
这个方法 :
1、在第一次打开数据库的时候才会走
2、在清除数据之后再次运行-->打开数据库,这个方法会走
3、没有清除数据,不会走这个方法
4、数据库升级的时候这个方法不会走
@Override
public void onCreate(SQLiteDatabase db) {
String searchKeyTable = "create table " + TABLE_NAME + " (" +
"id integer PRIMARY KEY AUTOINCREMENT," +
"title varchar ," +
"body varchar " +
")";
db.execSQL(searchKeyTable);
// 若不是第一个版本安装,直接执行数据库升级
// 不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final int FIRST_DATABASE_VERSION = 1;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
}
4、实现onUpgrade方法,根据旧版本号oldVersion和新版本号newVersion的不同进行版本迭代;
1、第一次创建数据库的时候,这个方法不会走
2、清除数据后再次运行(相当于第一次创建)这个方法不会走
3、数据库已经存在,而且版本升高的时候,这个方法才会调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 使用for实现跨版本升级数据库
for (int i = oldVersion; i < newVersion; i++) {
switch (i) {
case 1:
upgrade1ToVersion2(db);
break;
default:
break;
}
}
}
private void upgrade1ToVersion2(SQLiteDatabase db) {
String pushOrderStateChangeTable = "alter table " + TABLE_NAME + " add pic varchar";
db.execSQL(pushOrderStateChangeTable);
}
5、也可实现onDowngrade方法,此方法用来执行数据库的降级操作,只有新版本比旧版本低的时候才会执行,如果不执行降级操作,会抛出异常;
6、创建一个单例的类SQLiteConnectionDao来关闭和打开数据库;
public class SQLiteConnectionDao {
private static MySQLiteOpenHelper helper;
private static SQLiteConnectionDao instance;
private SQLiteDatabase mDatabase;
private AtomicInteger mOpenCounter = new AtomicInteger();//自增长类
public static SQLiteConnectionDao getInstance() {
if (instance == null) {
synchronized (SQLiteConnectionDao.class) {
if (instance == null) {
helper = new MySQLiteOpenHelper(Token.getContext());
instance = new SQLiteConnectionDao();
}
}
}
return instance;
}
//打开数据库方法
public synchronized SQLiteDatabase openDatabase() {
if (mOpenCounter.incrementAndGet() == 1) {//incrementAndGet会让mOpenCounter自动增长1
// Opening new database
try {
mDatabase = helper.getWritableDatabase();
} catch (Exception e) {
mDatabase = helper.getReadableDatabase();
}
}
return mDatabase;
}
//关闭数据库方法
public synchronized void closeDatabase() {
if (mOpenCounter.decrementAndGet() == 0) {//decrementAndGet会让mOpenCounter自动减1
// Closing database
mDatabase.close();
}
}
}
7、接下来实际操作数据库查询,但是一定注意这一步是耗时操作,应用中需要使用异步来进行操作数据库;
查询操作
也可使用query方法,
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 查询语句
columns想要显示的字段
selection条件
selectionArgs 中为selection的值
groupBy 分组
having 分组条件
orderBy 排序
limit 分页
我这里使用了rawQuery
SQLiteConnectionDao instance = SQLiteConnectionDao.getInstance();
SQLiteDatabase sqLiteDatabase = instance.openDatabase();
Cursor cursor = sqLiteDatabase.rawQuery("select * from " +MySQLiteOpenHelper.TABLE_NAME, null);
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndex("title"));
String body = cursor.getString(cursor.getColumnIndex("body"));
String pic = cursor.getString(cursor.getColumnIndex("pic"));
}
instance.closeDatabase();
插入操作
insert(String table, String nullColumnHack, ContentValues values) 插入语句
table表名
values为ContentValues对象!该对象存储方式为Key-value,Key表示表中的字段名称,value表示该字段对应的值
nullColumnHack表示强行向表中插入null,前提是第三个参数(values)为空或者不包含任何Key-value时生效
SQLiteConnectionDao instance = SQLiteConnectionDao.getInstance();
SQLiteDatabase sqLiteDatabase = instance.openDatabase();
ContentValues cv = new ContentValues();
cv.put("title", "title");
cv.put("body", "body");
cv.put("pic", "pic");
sqLiteDatabase.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
更新操作
update(String table, ContentValues values, String whereClause, String[] whereArgs) 更新语句
table为表名
values为ContentValues对象!该对象存储方式为Key-value,Key表示表中的字段名称
value表示该字段对应的值,第三个参数为条件例如:_ID = ? ,第四个参数为第三个参数的值!
SQLiteConnectionDao instance = SQLiteConnectionDao.getInstance();
SQLiteDatabase sqLiteDatabase = instance.openDatabase();
ContentValues values = new ContentValues();
values.put("body","body_change");
int update = sqLiteDatabase.update(MySQLiteOpenHelper.TABLE_NAME, values, "title=?", new String[]{"title1"});
instance.closeDatabase();
删除操作
delete(String table, String whereClause, String[] whereArgs) 删除数据
table表名
whereClause为条件例如:_ID = ?
whereArgs为whereClause的值!
SQLiteConnectionDao instance = SQLiteConnectionDao.getInstance();
SQLiteDatabase sqLiteDatabase = instance.openDatabase();
int delete = sqLiteDatabase.delete(MySQLiteOpenHelper.TABLE_NAME, "title=?", new String[]{"title1"});
instance.closeDatabase();
除了查询操作必须使用query或rawQuery外,其他的操作也可调用db.execSQL()参数中传入具体SQLite语句来执行增删改查操作;
示例代码:https://github.com/hnsycsxhzcsh/SQliteIteration