/**
* 添加图片表格
* @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'))是表格自动添加系统时间的关键。这个在建表的时候创建。后面添加数据的时候,不需要再进行输入时间。这个会在每条数据写入数据库的时候插入系统时间(设备当前的时间)
/**
* 删除表格里面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);这个指令
①创建表格时设置
/**
* 添加图片表格
* @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下出现相同的值时,这个方法的最后一个参数决定了,新数据和老数据的替换与否等问题。详细参数请看下方:
0 | CONFLICT_NONE | 未指定冲突解决方法 |
1 | CONFLICT_ROLLBACK | 当冲突发生,立即执行回滚操作,结束当前事务,命令终止并返回错误码SQLITE_CONSTRAINT |
2 | CONFLICT_ABORT | 当冲突发生,不执行回滚,保留同一事务内先前命令的更改。默认冲突处理策略。 |
3 | CONFLICT_FAIL | 当冲突发生,命令终止并返回错误码SQLITE_CONSTRAINT,但是错误发生前的改动被保存下来不会回退 |
4 | CONFLICT_IGNORE | 当冲突发生,发生冲突这一行将不被改变,继续执行下一条命令,并且不会返回任何错误 |
5 | CONFLICT_REPLACE | 当冲突发生,先前存在的那条数据将被替换然后继续执行下一条命令,并且不会返回任何错误 |