美文网首页
android 关于Sqlite的使用

android 关于Sqlite的使用

作者: 成旭辕 | 来源:发表于2018-04-10 16:15 被阅读0次

关于Sqite的使用,以及需要注意的地方,下面简单介绍一下

首先需要一个自定义的类继承SQLiteOpenHelper,并且实现构造方法,和onCreate()方法和onUpgrade

onCreate() 方法中创建数据库
onUpgrade() 方法中根据版本号来更新表

创建表的时候注意:
primary key: 主键
autoincrement: 自增型变量 (这个变量一般都要设置,主要根据你的需求来吧)
if not exists : 如果表已经创建过了就不再创建了

这里DatabaseHelper 用了一个单例,建议最好使用单例,一般情况使用数据库是都会使用到多线程,
多线程操作数据库是经常会遇到各种各样的坑

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String TAG = DatabaseHelper.class.getSimpleName();
    private static final String DB_NAME = "db_test";//数据库名称
    private static DatabaseHelper mInstance;

  public synchronized static DatabaseHelper getInstance() {
        if (mInstance == null) {
            mInstance = new DatabaseHelper(Application.getInstance(), DB_NAME, null, 1);
        }
        return mInstance;
    }

    public synchronized static void destoryInstance() {
        if (mInstance != null) {
            mInstance.close();
        }
    }

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table if not exists user(id integer primary key autoincrement, name, age, sex )");
        Log.i(TAG, "----create table user ----");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
     // switch(newVersion){ 
     // case 1: db.execSQL(第一个版本的建表语句); 
     // case 2: db.execSQL(第二个版本的建表语句); 
     // case 3: db.execSQL(第三个版本的建表语句); 
     //  }
    }
}

获取读写数据库SQLiteDatabase 管理类
public class DBManager {
 
  private static class DBManagerHolder {
        private final static DBManager mDBManager = new DBManager();
    }

    public static DBManager getInstance() {
        return DBManagerHolder.mDBManager;
    }


    /**
     * 获取可写数据库
     */
    public SQLiteDatabase getWritableDatabase() {
        return DatabaseHelper.getInstance().getWritableDatabase();
    }

    /**
     * 获取可读数据库
     *
     * @return SQLiteDatabase
     */
    public SQLiteDatabase getReadableDatabase() {
        return DatabaseHelper.getInstance().getReadableDatabase();
    }

}

针对具体的User的一个增删改查管理类
下面是一个具体的案例,插入,更新,删除,查询的操作也可以直接使用SQL语句,不过Google官方建立使用下面的方式

sql 语句方式:
  插入sql语句:  "insert into 表名(列名1,列名2,列名3) values(?,?,?)", new Object[]{列名1的值, 列名2的值, 列名3的值}
  更新sql语句:  "update user set 修改的列名 = ? where 修改的列名 = ?", new String[]{原来的值, 修改的值}
  删除sql语句:  "delete from person where 列名 = ?",new String[]{删除条件}
  查询sql语句:  "select * from person where 查询的列名 like ?",new String[]{查询条件}  eg: "select * from user where id like ?",new String[]{"1"}

  删除表sql语句: drop table if exists 表名   //这种方式把表直接干掉
  清空表sql语句: delete from if exists 表名   //这种方式把表里面的数据全部清空

  清空表将自增id恢复到从0开始,需要在执行一条语句 : "update sqlite_sequence set seq=0 where name='use'" 

  例如:   sqLiteDatabase.execSQL("delete from if exists user")
          sqLiteDatabase.execSQL("update sqlite_sequence set seq=0 where name='user'")
          清空user表,并将自增id从

class DbUserManager{
      /**
     *插入数据
     * @param name
     * @param age    
     * @param sex  一般:1男2女
     */
    public void insertUser(String name, Integer age, Int sex) {
        SQLiteDatabase sqLiteDatabase = DBManager.getInstance().getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("age", age);
        cv.put("sex", sex);
        sqLiteDatabase.insert(TABLE_USE, null, cv);
        sqLiteDatabase.close();
    }
    
    

/**
* 删除数据
*/
 public void delete(int id) {
        //得到一个可写的数据库
        SQLiteDatabase sqLiteDatabase = DBManager.getInstance().getWritableDatabase();
        String whereClauses = "id=?";
        String[] whereArgs = {String.valueOf(id)};
        sqLiteDatabase.delete(TABLE_MEMBER, whereClauses, whereArgs);
        sqLiteDatabase.close();
    }


 /**
 *
 *更新年纪
 *@param whoId 目标人的id
 *@param age  修改之后的年纪
 */
  public void update(whoId int,int age) {
        SQLiteDatabase sqLiteDatabase = DBManager.getInstance().getWritableDatabase();
        ContentValues cv = new ContentValues();
        //往ContentValues对象存放数据,键-值对模式
        cv.put("age", age);
        //where 子句 "?"是占位符号
        String whereClause = "id=?";
        String[] whereArgs = {String.valueOf(whoId)};
        sqLiteDatabase.update(TABLE_MEMBER, cv, whereClause, whereArgs);
        sqLiteDatabase.close();
    }

   
    
    /**
    *查询单独的一条数据
    *需要查询数据的id
    */
      public void read(int id) {
        SQLiteDatabase sqLiteDatabase = DBManager.getInstance().getReadableDatabase();
        Cursor cursor = sqLiteDatabase.query("user", new String[]{"id", "name", "age", "sex"}, "id=?", new String[]{String.valueOf(id)}, null, null, null);
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String age = cursor.getString(cursor.getColumnIndex("age"));
            String sex = cursor.getString(cursor.getColumnIndex("sex"));
            Log.i("query", "姓名:" + name + " " + "年龄:" + age + " " + "性别:" + sex);
        }
        cursor.close();
        //关闭数据库
        sqLiteDatabase.close();
    }

/**
**
*查询某张表中所有数据
*/
 public void getAllUer() {
       List<Map<String, Object>> mapList = new ArrayList<>();
        SQLiteDatabase sqLiteDatabase = DBManager.getInstance().getReadableDatabase();
        Cursor cursor = sqLiteDatabase.query(true, TABLE_MEMBER, new String[]{"id", "name", "age","sex"}, "", null, null, null, "id DESC", null);
       
        while (cursor.moveToNext()) {
            String id = cursor.getString(cursor.getColumnIndex("id"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String age = cursor.getString(cursor.getColumnIndex("age"));
            String sex = cursor.getString(cursor.getColumnIndex("sex"));
            
            Map<String, Object> map = new HashMap<>();
            map.put("name", name);
            map.put("age", age);
            map.put("sex", sex);
            mapList.add(map);
        }
        cursor.close();
        //关闭数据库
        sqLiteDatabase.close();
        
        //测试查询结果,需要时请删去下面这几行代码
        if(mapList ==null || mapList.size() ==0) return
         for (int i = 0; i < mapList.size(); i++) {
            Map<String, Object> map = mapList.get(i);
            LogUtils.i("query all", "姓名:" + map.get("name") + " " + "年龄:" + map.get("age") + " " + "性别:" + map.get("sex"));
        }
      
    } 
    
    
}

测试调用


class TestActivity extends AppCompatActivity{
    
    private DbUserManager mDbUserManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDbUserManager = new DbUserManager();
        test()
    }

    private void test(){

       //插入数据
       mDbUserManager.insertUser("程序员1",26,1);
       mDbUserManager.insertUser("程序员2",26,2);

       //读取数据
       mDbUserManager.getAllUer();

       //更新数据
       mDbUserManager.update(1,25);

    }

} 
数据库事务问题

有时候遇到某些需求,需要添加事务

SQLiteDatabase db = DBManager.getInstance().getWritableDatabase();
db.beginTransaction(); // 开启事务
try {
    db.execSQL("你的SQL语句1");
    db.execSQL("你的SQL语句2");
    db.setTransactionSuccessful(); // 标记事务完成
} finally {
    db.endTransaction(); // 结束事务
    db.close();
}

注释:
调用SQLiteDatabase的beginTransaction()方法可以开启一个事务,
调用 endTransaction() 结束事务 当程序执行到endTransaction() 方法时,会检查事务的标志是否为成功,
如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,
如果没有调用setTransactionSuccessful() 方法则回滚事务

这么说不一定能懂,那么啥叫事务呢?
你可以看作是一组操作,只有一组动作全部完成,才算完成,中间任何一个地方出现问题,就回滚,
比如说你去ATM机取钱,第一步插入看,第二步输入密码,第三步输取款金额,第四步把钱取出来,第五步取卡。
好,假如你现在进行到第三步输入了取款金额,突然断电了,你还没来得及把钱取出来,假如没有用事务的话,你卡里的钱就会被扣掉,
这个时候你是不是会疯掉,😄 ,如果用事务的话,就会把你整个取钱的五个步骤看成是一个整体,任何有个步骤出现问题都会回滚(就会回到原来没有执行任何SQL之前的样子)
突然断电了也不要紧,事务一回滚,你的钱就会回到你取钱之前的数额,这就是事务,现在你能理解了吧。

相关文章

网友评论

      本文标题:android 关于Sqlite的使用

      本文链接:https://www.haomeiwen.com/subject/ggdnhftx.html