美文网首页
复用代码整理篇 — 数据库

复用代码整理篇 — 数据库

作者: 一盘好书 | 来源:发表于2020-03-25 10:30 被阅读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,否则不变。

    相关文章

      网友评论

          本文标题:复用代码整理篇 — 数据库

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