Sqlite3-插入系统时间/删除N天前数据

1,sqlite3表格自动插入系统时间

/**
     * 添加图片表格
     * @param sqLiteDatabase
     */
    private void addPictureTab(SQLiteDatabase sqLiteDatabase){
        StringBuffer vStringBuffer=new StringBuffer();
        vStringBuffer.append("Create table if not exists picture_tab(");
        vStringBuffer.append("AutoID integer primary key autoincrement,");
        vStringBuffer.append("filename varchar(30),");                    //文件名称,包括拓展名 20230531091641.jpg
        vStringBuffer.append("ext varchar(10),");                       //文件的拓展名
        vStringBuffer.append("name varchar(30),");                      //文件名 20230531091641
        vStringBuffer.append("filepath varchar(150),");                 //文件路径  后面取出来之后如果没有,需要将相关记录清除
        vStringBuffer.append("item3 varchar(30),");                     //备用1
        vStringBuffer.append("item4 varchar(30),");                     //备用2
        vStringBuffer.append("item5 int,");                             //备用3
        vStringBuffer.append("item6 int,");                              //备用4
        vStringBuffer.append("date timestamp not null default (datetime('now','localtime')))");//添加日期 其中date是日志的表头 column
        String sSQL=vStringBuffer.toString();
        sqLiteDatabase.execSQL(sSQL);
    }

其中date timestamp not null default (datetime('now','localtime'))是表格自动添加系统时间的关键。这个在建表的时候创建。后面添加数据的时候,不需要再进行输入时间。这个会在每条数据写入数据库的时候插入系统时间(设备当前的时间)

2,sqlite3删除N天前的数据

/**
     * 删除表格里面7天之前的数据, 忽略时间精度,直接比较日期,删除N天前的数据。即删除包括当前在内的往前数7天
     */
    public void delData(int day){
        SQLiteDatabase sdb=sqliteHelper.getWritableDatabase();
        String sqlStr="DELETE FROM pic_tab WHERE date('now', '-"+day+" day') >= date(date);";
        Log.i("TAG", "delData: 删除之前的数据的sql Str="+sqlStr);
        sdb.execSQL(sqlStr);

    }
这个方法主要用于sqlite3获取sdb的时候,关键是DELETE FROM pic_tab WHERE date('now', '-"+day+" day') >= date(date);这个指令

3,sqlite3内容插入唯一设置

①创建表格时设置

/**
     * 添加图片表格
     * @param sqLiteDatabase
     */
    private void addPicTab(SQLiteDatabase sqLiteDatabase){
        StringBuffer vStringBuffer=new StringBuffer();
        vStringBuffer.append("Create table if not exists pic_tab(");
        vStringBuffer.append("AutoID integer primary key autoincrement,");
        vStringBuffer.append("filename varchar(30),");                    //文件名称 20230531091641.jpg
        vStringBuffer.append("ext varchar(10),");                       //文件的拓展名
        vStringBuffer.append("name varchar(30) unique,");                      //文件名 约束唯一标识数据表中的每条记录 避免出现两条一样的数据
        vStringBuffer.append("filepath varchar(150),");                 //文件路径  后面取出来之后如果没有,需要将相关记录清除
        vStringBuffer.append("item3 varchar(30),");                     //备用1
        vStringBuffer.append("item4 varchar(30),");                     //备用2
        vStringBuffer.append("item5 int,");                             //备用3
        vStringBuffer.append("item6 int,");                              //备用4
        vStringBuffer.append("date timestamp not null default (datetime('now','localtime')))");//添加日期 其中date是日期
        String sSQL=vStringBuffer.toString();
        sqLiteDatabase.execSQL(sSQL);
    }

其中vStringBuffer.append("name varchar(30) unique,");                      //文件名 unique约束唯一标识数据表中的每条记录 避免出现两条一样的数据

②插入表格方法

/**
     * 添加一个item进去
     * @param contentValues
     */
    public void saveItem(ContentValues contentValues){
        SQLiteDatabase sdb=sqliteHelper.getWritableDatabase();
        sdb.insertWithOnConflict("pic_tab",null,contentValues,SQLiteDatabase.CONFLICT_IGNORE);//这个是为了输入同一条数据的时候起冲突选择不更新数据
        Log.e("tiwolf", "receiveWork saveItem: "+contentValues.get("filePath") );
    }

其中,需要使用

sdb.insertWithOnConflict("pic_tab",null,contentValues,SQLiteDatabase.CONFLICT_IGNORE);

这个方法进行数据插入,不然会报错。当同一column下出现相同的值时,这个方法的最后一个参数决定了,新数据和老数据的替换与否等问题。详细参数请看下方:

insertWithOnConflict方法插入数据最后一个参数详情解释
0 CONFLICT_NONE 未指定冲突解决方法
1 CONFLICT_ROLLBACK 当冲突发生,立即执行回滚操作,结束当前事务,命令终止并返回错误码SQLITE_CONSTRAINT
2 CONFLICT_ABORT 当冲突发生,不执行回滚,保留同一事务内先前命令的更改。默认冲突处理策略。
3 CONFLICT_FAIL 当冲突发生,命令终止并返回错误码SQLITE_CONSTRAINT,但是错误发生前的改动被保存下来不会回退
4 CONFLICT_IGNORE 当冲突发生,发生冲突这一行将不被改变,继续执行下一条命令,并且不会返回任何错误
5 CONFLICT_REPLACE 当冲突发生,先前存在的那条数据将被替换然后继续执行下一条命令,并且不会返回任何错误

你可能感兴趣的:(Android问题解决,Android,android,sqlite,数据库)