复用代码整理篇 — 数据库

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;");
上一篇下一篇

猜你喜欢

热点阅读