复用代码整理篇 — 数据库
2020-03-25 本文已影响0人
一盘好书
程序员的效率一方面体现在解决问题的速度上,另一方面体现在已有的编程经验的复用。做得好的人,每一次的工作经验都有可浓缩的代码,而这一部分代码是拿来即可用,效率的提高可想而知。
从这个角度出发,你能否拿出与你工作年限相匹配的复用成果,并且逐年完善这些代码,可体现你工作的真正价值。
出于这个原因,我着手开始写一些真正复用性高的代码,提高编写程序的效率。
因为刚刚着手,可能有很多做的不到位的地方,欢迎多提意见。
数据库的例子
public class DatabaseManager extends SQLiteOpenHelper {
private static final String DB_NAME = "collection.db";
private static int DB_VERSION = 1;
private static final String LOG_TAG = DatabaseManager.class.getSimpleName();
private static DatabaseManager sInstance;
public DatabaseManager(@Nullable Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
public static DatabaseManager getInstance() {
if (sInstance == null) {
synchronized (LOG_TAG) {
if (sInstance == null) {
sInstance = new DatabaseManager(AppApplication.getInstance().getApplicationContext());
}
}
}
return sInstance;
}
/**
* 1、onCreate 在首次调用getReadableDatabase或getWritableDatabase方法时调用;
* 2、而后不论DatabaseManager类再次初始化多少次都不会调用onCreate方法。
*/
@Override
public void onCreate(SQLiteDatabase db) {
createUpdateDataTable(db);
}
/**
* 1、更改数据库版本为2,此时手机上的版本为1,进行覆盖安装时,oldVersion为手机上的
* 版本,newVersion为新装数据库的版本。
* 2、在调用getReadableDatabase或getWritableDatabase方法时触发。
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1) {
onDatabaseUpdateFrom1to2(db);
oldVersion++;
}
if (oldVersion == 2) {
// ...
}
}
private void onDatabaseUpdateFrom1to2(SQLiteDatabase db) {
}
private void createUpdateDataTable(SQLiteDatabase db) {
String sql = "create table if not exists " +
DatabaseConstants.Tables.TABLE_UPLOAD +
"(_id integer primary key autoincrement," +
DatabaseConstant.UploadDataColumnName.KEY + " text," +
DatabaseConstant.UploadDataColumnName.JSON_VALUE + " text," +
DatabaseConstant.UploadDataColumnName.TIME_STAMP + " text" +
")";
db.execSQL(sql);
}
}
为避免数据库字段出错,将数据库所有数据统一定义一个类中。
public class DatabaseConstants {
public static class Tables {
static final String TABLE_UPLOAD = "_upload";
}
public class ConversationColumn{
public static final String PERSON_NAME = "name";
}
}
在线查看数据库工具
gradle文件中增加如下代码
debugImplementation 'com.amitshekhar.android:debug-db:1.0.0'
打开日志过滤:DebugDB。
程序运行后,会在过滤日志中打印一个网址,复制进入这个网址,可看到所有数据库数据。
在这个网页进行sql语句操作时,语句末尾要加分号。
WX20200325-222948@2x.png数据库语句
1.查询
如果纯写数据库语句进行操作,text
类型记得增加单引号。
// 查询前十条语句
"select * from "+ TableName + " where 1=1 limit 10";
// 占位符查询语句
String sql = "select * from " + USER_TABLE_NAME + " where name=?";
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(sql, new String[]{name});
2.更新
// 更新所有数据的 state 列为1
"update " + TableName + " set state=1 where 1=1";
// upload_times自增1
update TableName set upload_times=upload_times+1 where _id>=4 and _id<=6;
3.插入
"insert into " + TableName + " (name, age) values ('zp', 15)";
4.删除
"delete from " + TableName + " where _id="+ id;
5.触发器
db.execSQL("CREATE TRIGGER cal_unread_count AFTER INSERT " +
"ON _message " +
"BEGIN " +
"UPDATE _conversation SET _unread_count = (CASE WHEN new._from = _target_name AND new._is_read = 0 THEN _unread_count + 1 ELSE _unread_count END); " +
"END;");
- 创建一个触发器名叫cal_unread_count;
- 触发条件:表_message有数据被插入时;
- 触发逻辑:当_conversation表的_target_name等于_message表的_from字段并且_message_is_read为0,则表_conversation的_unread_count字段自增1,否则不变。