Android - sqlite - createdAt和updatedAt - 事件?

时间:2017-10-07 11:24:04

标签: android sqlite android-sqlite

我是Android的新手。现在我创建SQLite数据库,我想创建字段createdAt和updatedAt。 在其他语言和框架中,可以自动添加createdAt和updatedAt字段。我知道 - 在SQLite中没有日期列,所以最好创建自己的这个函数,但是如果我有例如将数据插入Activity和Fragment中的一个表,那么我可以自动更新字段updatedAt吗?

最好和最简单的方法是什么?

1 个答案:

答案 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 : -

DBHelper(SQLiteOpenHelper子类): -

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);
        }
    }
}

具有Activcity的用法(在这种情况下为MainActivity): -

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 片段内。