我是Android的新手。现在我创建SQLite数据库,我想创建字段createdAt和updatedAt。 在其他语言和框架中,可以自动添加createdAt和updatedAt字段。我知道 - 在SQLite中没有日期列,所以最好创建自己的这个函数,但是如果我有例如将数据插入Activity和Fragment中的一个表,那么我可以自动更新字段updatedAt吗?
最好和最简单的方法是什么?
答案 0 :(得分:0)
虽然日期/时间没有特定的列类型,但SQLite确实具有日期/时间功能。这与列类型的灵活性使得为日期列提供相对简单。
例如,如果您使用以下作为SQL来创建表: -
CREATE TABLE IF NOT EXISTS mytable (
_id INTEGER PRIMARY KEY,
created TEXT DEFAULT CURRENT_TIMESTAMP,
updated TEXT,
mydata TEXT
)
添加新行时, created
列将设置当前日期时间。
e.g。它的价值将与 2017-10-07 20:37:51
您可以使用以下sql更新 updated
列: -
UPDATE mytable SET updated = DATETIME('NOW') WHERE _id = id_of_row_to_be_updated.
您可能会发现SQL As Understood By SQLite - Date And Time Functions有趣或有用。
或者你可以使用时间戳,例如通过存储System.currentTimeMillis();
以下是代码,它使用两个方法列 created
和 updated
用于将值存储为字符串和时间戳为altcrtd
和 altupdtd
: -
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "logging";
public static final String TBNAME = "log";
public static final String CREATED_COL = "created";
public static final String ALTCREATED_COL = "altcrtd";
public static final String UPDATED_COL = "updated";
public static final String ALTUPDATED_COL = "altupdtd";
public static final String MYDATA_COL = "mydata";
public static final String ID_COL = "_id";
public static final int DBVERSION = 1;
SQLiteDatabase mDB;
DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String tblcrt = "CREATE TABLE IF NOT EXISTS " + TBNAME + "(" +
ID_COL + " INTEGER PRIMARY KEY, " +
CREATED_COL + " TEXT DEFAULT CURRENT_TIMESTAMP, " +
UPDATED_COL + " TEXT, " +
ALTCREATED_COL + " INTEGER DEFAULT 0, " +
ALTUPDATED_COL + " INTEGER DEFAULT 0, " +
MYDATA_COL + " TEXT" +
")";
sqLiteDatabase.execSQL(tblcrt);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public void insertLogRow(String mydata) {
ContentValues cv = new ContentValues();
cv.put(MYDATA_COL,mydata);
cv.put(ALTCREATED_COL,Long.toString(System.currentTimeMillis()));
mDB.insert(TBNAME,null,cv);
}
public void updateLogRow(Long id, String mydate) {
ContentValues cv = new ContentValues();
if ((mydate != null) && (mydate.length() > 0)) {
cv.put(MYDATA_COL,mydate);
}
cv.put(ALTUPDATED_COL,Long.toString(System.currentTimeMillis()));
mDB.update(TBNAME,cv,ID_COL + "=?",new String[]{Long.toString(id)});
String sql = "UPDATE " + TBNAME +
" SET " + UPDATED_COL + " = DATETIME('NOW') WHERE " +
ID_COL + " = " + Long.toString(id);
mDB.execSQL(sql);
}
public void displayAllRowsToLog() {
Cursor csr = mDB.query(TBNAME,null,null,null,null,null,null);
while (csr.moveToNext()) {
String displaydata = "Row - " + Integer.toString(csr.getPosition() + 1) +
" \n\tCREATED ON " + csr.getString(csr.getColumnIndex(CREATED_COL)) + " (TEXT)" +
" \n\tALTCRTD ON " + Long.toString(csr.getLong(csr.getColumnIndex(ALTCREATED_COL))) + " (LONG)" +
" \n\tUPDATED ON " + csr.getString(csr.getColumnIndex(UPDATED_COL)) + " (TEXT)" +
"\n\tALTUPDTD ON " + Long.toString(csr.getLong(csr.getColumnIndex(ALTUPDATED_COL))) + " (LONG)";
Log.d("DBINFO",displaydata);
}
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// get an instance of the DBHelper
DBHelper dbhlpr = new DBHelper(this);
// Insert some rows
dbhlpr.insertLogRow("FIRST");
dbhlpr.insertLogRow("SECOND");
dbhlpr.insertLogRow("THIRD");
// Display the current values
dbhlpr.displayAllRowsToLog();
// Update some rows (including a non-existant row)
dbhlpr.updateLogRow(1L,"FIRST MODIFIED");
dbhlpr.updateLogRow(20L,"No SUCH ROW"); // will do nothing as row doesn't exist
dbhlpr.updateLogRow(3L,"THIRD MODIFIED");
// Display the update rows
dbhlpr.displayAllRowsToLog();
}
}
10-08 08:16:16.997 7461-7461/mjt.so46619595_createdupdateddatetime D/DBINFO: Row - 1
CREATED ON 2017-10-07 21:16:16 (TEXT)
ALTCRTD ON 1507410976988 (LONG)
UPDATED ON null (TEXT)
ALTUPDTD ON 0 (LONG)
10-08 08:16:16.997 7461-7461/mjt.so46619595_createdupdateddatetime D/DBINFO: Row - 2
CREATED ON 2017-10-07 21:16:16 (TEXT)
ALTCRTD ON 1507410976991 (LONG)
UPDATED ON null (TEXT)
ALTUPDTD ON 0 (LONG)
10-08 08:16:16.997 7461-7461/mjt.so46619595_createdupdateddatetime D/DBINFO: Row - 3
CREATED ON 2017-10-07 21:16:16 (TEXT)
ALTCRTD ON 1507410976994 (LONG)
UPDATED ON null (TEXT)
ALTUPDTD ON 0 (LONG)
10-08 08:16:17.011 7461-7461/mjt.so46619595_createdupdateddatetime D/DBINFO: Row - 1
CREATED ON 2017-10-07 21:16:16 (TEXT)
ALTCRTD ON 1507410976988 (LONG)
UPDATED ON 2017-10-07 21:16:17 (TEXT)
ALTUPDTD ON 1507410976997 (LONG)
10-08 08:16:17.011 7461-7461/mjt.so46619595_createdupdateddatetime D/DBINFO: Row - 2
CREATED ON 2017-10-07 21:16:16 (TEXT)
ALTCRTD ON 1507410976991 (LONG)
UPDATED ON null (TEXT)
ALTUPDTD ON 0 (LONG)
10-08 08:16:17.011 7461-7461/mjt.so46619595_createdupdateddatetime D/DBINFO: Row - 3
CREATED ON 2017-10-07 21:16:16 (TEXT)
ALTCRTD ON 1507410976994 (LONG)
UPDATED ON 2017-10-07 21:16:17 (TEXT)
ALTUPDTD ON 1507410977004 (LONG)
可以从片段中调用 updateLogRow
,您可能必须先获取 DBHelper
片段内。