安卓Sqlite数据库

参考视频学习:https://www.bilibili.com/video/BV1wt411n7pz
查看数据库的软件 SQLite Expert
从编译器右下角打开的模拟器中找到对应项目的数据库文件,然后添加到软件中去查看

  • 创建数据库
  • Dao层去增删改查
  • 一个常量类去管理
public class Constants {

    public static final String DATABASE_NAME = "test.db";

    public static final int DATABASE_VERSION = 3;

    public static final String TABLE_NAME = "employee";
    
}

Sql语言版

public class Dao {

   private DatabaseHelper mHelper;
   private static final String TAG = "Dao";

   public Dao(Context context) {
       //创建数据库
       mHelper = new DatabaseHelper(context);
   }

   public void insert() {
       SQLiteDatabase db = mHelper.getWritableDatabase();
       String sql = "insert into "+Constants.TABLE_NAME+"(_id,name,age,salary,phone,average,address) " +
               "values(?,?,?,?,?,?,?)";
       db.execSQL(sql,new Object[]{1,"Mike",60,111,110,55,"USA"});
       db.close();
   }

   public void delete() {
       SQLiteDatabase db = mHelper.getWritableDatabase();
       String sql = "delete from "+Constants.TABLE_NAME+" where age = 60";
       db.execSQL(sql);
       db.close();
   }

   public void update() {
       SQLiteDatabase db = mHelper.getWritableDatabase();
       String sql = "update "+Constants.TABLE_NAME+" set salary = 2 where age = 60";
       db.execSQL(sql);
       db.close();
   }

   public void query() {
       SQLiteDatabase db = mHelper.getWritableDatabase();
       String sql = "select * from "+Constants.TABLE_NAME;
       Cursor cursor = db.rawQuery(sql, null);
       while (cursor.moveToNext()) {
           //返回name是第几列
           int index = cursor.getColumnIndex("name");
           //返回name那一列的并转成字符串
           String name = cursor.getString(index);
           Log.e(TAG, "query: "+name );
       }
       cursor.close();
       db.close();
   }
}

使用API版本的

public class Dao {

    private DatabaseHelper mHelper;
    private static final String TAG = "Dao";

    public Dao(Context context) {
        //创建数据库
        mHelper = new DatabaseHelper(context);
    }

    public void insert() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("_id",2);
        values.put("name","Tom");
        values.put("age",20);
        values.put("salary",100);
        values.put("phone",120);
        values.put("average",123);
        values.put("address","China");
        db.insert(Constants.TABLE_NAME,null,values);

        db.close();
    }

    public void delete() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.delete(Constants.TABLE_NAME,"age=?",new String[]{"20"});
        db.close();
    }

    public void update() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("age",50);
        db.update(Constants.TABLE_NAME,values,"name = ?",new String[]{"Tom"});
        db.close();
    }

    public void query() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        Cursor cursor = db.query(Constants.TABLE_NAME, null, "age = 50", null, null, null, null);
        while (cursor.moveToNext()){
            Log.e(TAG, "name->"+cursor.getString(cursor.getColumnIndex("name")));
        }
        cursor.close();
        db.close();
    }
}

  • 测试类测试
@RunWith(AndroidJUnit4.class)
public class TestDatabase {
    Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();

    @Test
    public void testCreate() {

    }
    @Test
    public void testInsert() {
        Dao dao = new Dao(context);
        dao.insert();
    }
    @Test
    public void testDelete() {
        Dao dao = new Dao(context);
        dao.delete();
    }
    @Test
    public void testUpdate() {
        Dao dao = new Dao(context);
        dao.update();
    }
    @Test
    public void testQuery() {
        Dao dao = new Dao(context);
        dao.query();
    }
}

  • 数据库事务
    两个特点
    • 安全性
      比如公司有一百万,你的工资是一万,当工资给你发工资时,这时突然停电,公司账户少了一万,但你的账户没有增加钱,这就是安全性不够.
      安全性:当有异常时就会两个都不变,不发生异常时会正常变化
public class DataBaseHelper extends SQLiteOpenHelper {
    private static final String TABLE_NAME = "account";
    public DataBaseHelper(@Nullable Context context) {
        super(context, "test.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table "+TABLE_NAME+"(_id integer,name varchar,money integer)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
@RunWith(AndroidJUnit4.class)
public class TestDataBase {

    Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
    private DataBaseHelper mHelper = new DataBaseHelper(context);

    @Test
    public void testDataBase() {
        mHelper.getWritableDatabase();
    }

    @Test
    public void testInsert() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        String sql = "insert into account values (1,'company',1000000)";
        String sql1 = "insert into account values (2,'my_count',0)";
        db.execSQL(sql);
        db.execSQL(sql1);
    }

	//当有异常时就会两个都不变,不发生异常时会正常变化
    @Test
    public void testUpdate() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.beginTransaction();
        try {
            String sql = "update account set money = 1000000 - 10000 where name = 'company'";
            //int i = 10 / 0;
            String sql1 = "update account set money = 10000 where name = 'my_count'";
            db.execSQL(sql);
            db.execSQL(sql1);
            db.setTransactionSuccessful();
        }catch (Exception e){
            throw new RuntimeException("发生异常!");
        }finally {
            db.endTransaction();
            db.close();
        }
    }

}
  • 高效性
    添加大量数据时,使用的时间长短
    加上这两句,效率会提升几十倍,因为添加后数据一次性添加进去,而不是一条一条地添加
    db.beginTransaction();
    db.endTransaction();
@Test
    public void testInsert() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        Long start = System.currentTimeMillis();
        db.beginTransaction();
        for(int i=0;i<3000;i++) {
            String sql = "insert into account values (1,'company',1000000)";
            db.execSQL(sql);
        }
        db.endTransaction();
        Log.e(TAG, "time -> " + (System.currentTimeMillis() - start) );
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章