SQLite的使用与迭代更新

转载请标明出处:https://blog.csdn.net/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

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值