本篇从数据库的基本使用开始,然后利用反射+泛型对数据库操作进行优化,批量插入操作使用事务提高效率,采用链式调用方式优化查询操作。
最后是封装一个高可用,易替换,不受框架影响的数据库操作SDK。
一、SQLite基本使用
1.1 数据库及表的创建
public class DbHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
private static final String DB_NAME = "person.db";
public static final String TABLE_NAME = "person";
private static final String CREATE_TABLE_SQL = "CREATE TABLE IF NOT EXISTS "
+ TABLE_NAME +
" (id integer primary key autoincrement, name text, age integer);";
public DbHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
1.2 数据库操作的实现(增、删、改、查)
public class DbManager {
private static DbManager sDbManager;
private DbHelper mDbHelper;
private DbManager(Context context) {
mDbHelper = new DbHelper(context);
}
public static DbManager getInstance(Context context) {
if (sDbManager == null) {
synchronized (DbManager.class) {
if (sDbManager == null) {
sDbManager = new DbManager(context);
}
}
}
return sDbManager;
}
public long insert(Person person) {
ContentValues values = contentValuesByObj(person);
SQLiteDatabase database = mDbHelper.getWritableDatabase();
return database.insert(DbHelper.TABLE_NAME, null, values);
}
public int delete(String whereClause, String...whereArgs) {
SQLiteDatabase database = mDbHelper.getWritableDatabase();
return database.delete(DbHelper.TABLE_NAME, whereClause, whereArgs);
}
public int update(Person person, String whereClause, String... whereArgs) {
SQLiteDatabase database = mDbHelper.getWritableDatabase();
ContentValues values = contentValuesByObj(person);
return database.update(DbHelper.TABLE_NAME, values, whereClause, whereArgs);
}
public List<Person> queryAll() {
return query(null, null, null, null, null, null, null);
}
public List<Person> query(String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit) {
SQLiteDatabase database = mDbHelper.getWritableDatabase();
Cursor cursor = database.query(DbHelper.TABLE_NAME, columns,
selection, selectionArgs, groupBy, having, orderBy, limit);
if (cursor != null && cursor.moveToFirst()) {
List<Person> persons = new ArrayList<>();
do {
int idColumnIndex = cursor.getColumnIndex("id");
int nameColumnIndex = cursor.getColumnIndex("name");
int ageColumnIndex = cursor.getColumnIndex("age");
int id = cursor.getInt(idColumnIndex);
String name = cursor.getString(nameColumnIndex);
int age = cursor.getInt(ageColumnIndex);
Person person = new Person(id, name, age);
persons.add(person);
} while (cursor.moveToNext());
return persons;
}
return null;
}
private ContentValues contentValuesByObj(Person person) {
ContentValues values = new ContentValues();
if (person.getId() != 0) {
values.put("id", person.getId());
}
values.put("name", person.getName());
values.put("age", person.getAge());
return values;
}
}
1.3 测试
public class MainActivity extends AppCompatActivity {
@ViewById(R.id.tv)
private TextView mTv;
@ViewById(R.id.input_et)
private EditText mInputEt;
private DbManager mDbManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewUtils.inject(this);
mDbManager = DbManager.getInstance(this);
}
@OnClick(R.id.btn)
private void click() {
Toast.makeText(MainActivity.this, mTv.getText().toString(), Toast.LENGTH_SHORT).s