【发布时间】:2014-05-08 19:59:09
【问题描述】:
如何检索包含 SQLite TIMESTAMP 列的行并将这些列转换为 Android 中的 Java Date 类型参数。
我想使用 Android 游标 db.query 从 SQLite 数据库中检索行,这里是表定义
private final static String TABLE_NAME = "custTable";
private final static String COLUMN_ID = "_id";
private final static String COLUMN_NAME = "name";
private final static String COLUMN_EMAIL = "email";
private final static String COLUMN_PHONE = "phone";
private final static String COLUMN_UID = "card_uid2";
private final static String COLUMN_INITIAL_VALUE = "initial_value";
private final static String COLUMN_CURRENT_VALUE = "current_value";
private final static String COLUMN_DATE_CREATED = "enrollment_date";
private final static String COLUMN_LAST_UPDATED = "last_transaction_date";
这是我的游标 db.query 语句
Cursor cursor = database.query(TABLE_NAME, new String[]{ COLUMN_ID,COLUMN_NAME,COLUMN_EMAIL, COLUMN_PHONE +
COLUMN_UID, COLUMN_INITIAL_VALUE, COLUMN_CURRENT_VALUE,COLUMN_DATE_CREATED,COLUMN_LAST_UPDATED}, null, null, null, null, null);
如果我这样做,我如何将我的两个 SQLite Timestamp 列转换或转换为 Java Date 参数。经过多次尝试,我尝试像这样使用 cursor db.rawquery
Cursor cursor = database.rawQuery(
"SELECT _id, name, email, phone, card_uid2, initial_value, current value," +
" (strftime('%s', enrollment_date) * 1000) AS enrollment_date, " +
" (strftime('%s', last_transaction_date) * 1000) AS last_transaction_date, +" +
"FROM custTable", new String[0]);
使用 db.rawquery 选项,我继续更改为 Java Date 参数,例如
long millis_enrolled = cursor.getLong(cursor.getColumnIndexOrThrow("enrollment_date"));
Date enrolledDate = new Date(millis_enrolled);
customer.setEnrollmentDate(enrolledDate);
long millis_updated = cursor.getLong(cursor.getColumnIndexOrThrow("last_transaction_date"));
Date updatedDate = new Date(millis_updated);
customer.setEnrollmentDate(updatedDate);
无论哪种方式,当我尝试在我的 Activity 中访问这些值时,我都会收到类似的 Java NullPointerException
05-08 15:52:45.484: W/dalvikvm(1950): threadid=1: thread exiting with uncaught exception (group=0xb1f07648)
05-08 15:52:45.484: E/AndroidRuntime(1950): FATAL EXCEPTION: main
05-08 15:52:45.484: E/AndroidRuntime(1950): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.txsystems.valuecard/com.txsystems.valuecard.app.ReportActivity}: java.lang.NullPointerException
05-08 15:52:45.484: E/AndroidRuntime(1950): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
05-08 15:52:45.484: E/AndroidRuntime(1950): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
05-08 15:52:45.484: E/AndroidRuntime(1950): at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-08 15:52:45.484: E/AndroidRuntime(1950): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
05-08 15:52:45.484: E/AndroidRuntime(1950): at android.os.Handler.dispatchMessage(Handler.java:99)
05-08 15:52:45.484: E/AndroidRuntime(1950): at android.os.Looper.loop(Looper.java:137)
05-08 15:52:45.484: E/AndroidRuntime(1950): at android.app.ActivityThread.main(ActivityThread.java:5103)
05-08 15:52:45.484: E/AndroidRuntime(1950): at java.lang.reflect.Method.invokeNative(Native Method)
所以我的问题再次是如何检索包含 SQLite TIMESTAMP 列的行并将这些列转换为 Java Date 类型参数。
这里是创建表语句
private static final String CREATE_CUSTOMER_TABLE =
"CREATE TABLE " + TABLE_NAME + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT NOT NULL, " +
COLUMN_EMAIL + " TEXT, " +
COLUMN_PHONE + " TEXT, " +
COLUMN_UID + " TEXT, " +
COLUMN_DATE_CREATED + " TIMESTAMP NOT NULL DEFAULT current_timestamp, " +
COLUMN_LAST_UPDATED + " TIMESTAMP NOT NULL DEFAULT current_timestamp, " +
COLUMN_INITIAL_VALUE + " NUMERIC, " +
COLUMN_CURRENT_VALUE + " NUMERIC " +
")";
更多 Logcat 输出
05-08 17:12:46.857: I/Enrollment(2398): Calling the GetAll Customers method
05-08 17:12:46.857: I/Enrollment(2398): Inside getAllCustomer function
05-08 17:12:46.857: D/AndroidRuntime(2398): Shutting down VM
05-08 17:12:46.857: W/dalvikvm(2398): threadid=1: thread exiting with uncaught exception (group=0xb1f07648)
05-08 17:12:46.857: E/AndroidRuntime(2398): FATAL EXCEPTION: main
05-08 17:12:46.857: E/AndroidRuntime(2398): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.txsystems.valuecard/com.txsystems.valuecard.app.ReportActivity}: java.lang.NullPointerException
05-08 17:12:46.857: E/AndroidRuntime(2398): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
【问题讨论】:
-
我建议你查看完整的堆栈跟踪,看看 NPE 在哪里。
-
我想我们需要看看create table语句。我不认为时间戳数据类型只是用于日期操作的函数。
-
我已经添加了 create table 语句,我可以使用 sqlite3 命令验证表已创建并且我正在向表中写入数据。
-
你能指出你得到 NPE 的那条线吗?
-
添加了更多显示 NPE 的 Logcat 输出,谢谢
标签: java android sqlite android-sqlite