我无法让光标从 SQlite 数据库返回更新的信息。我发现 requery() 已贬值。Android Dev 网站说每次需要新信息时都会创建一个新光标。该网站还说使用线程。
问题 1:我正在使用异步任务从数据库中获取更新的数据。异步任务正在工作,但它检索旧数据。是否有另一种方法可以使游标返回最新数据?还是我错过了什么?
问题 2. 我需要一个“光标适配器”吗?我希望返回新数据,并且我没有在列表中显示数据,因此拥有一个没有意义。但如果这是返回新数据的唯一方法,请告诉我。
我在数据库类中使用 cursor.close()。
我的异步任务:
private class ButtonDataTask extends AsyncTask<Void,Void,Void> {
String x;
String time;
private final ProgressDialog dialog = new ProgressDialog(
AlertsDetails.this);
// can use UI thread here
protected void onPreExecute() {
this.dialog.setMessage("Selecting data...");
this.dialog.show();
}
// can use UI thread here
@SuppressWarnings("unused")
protected void onPostExecute(Void result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
if (alertState == 1) {
mAlertTime.setText("ALERT OFF");
}
if (alertState == 0) {
mAlertTime.setText(x);
}
}
@Override
protected Void doInBackground(Void... params) {
DatabaseSqlite updateAlertStatus = new DatabaseSqlite(
AlertsDetails.this);
if (alertState == 0) {
alertState = 1;
updateAlertStatus.open();
updateAlertStatus.updateAlertState(id, alertState);
alertState = updateAlertStatus.getAlertState(id);
updateAlertStatus.close();
}
else {
alertState = 0;
updateAlertStatus.open();
x ="ALERT ON "
+ updateAlertStatus.getAlertTime(id)
+ " from button";
updateAlertStatus.updateAlertState(id, alertState);
alertState = updateAlertStatus.getAlertState(id);
//mAlertStateDisplay.setText(" ");
updateAlertStatus.close();
}
return null;
}
}
数据库:
package com.google.android.gcm.demo.app.sqllite;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import org.json.JSONObject;
import com.google.android.gcm.demo.app.Alerts.AlertAdapter;
import com.google.android.gcm.demo.app.Alerts.Alerts;
import com.google.android.gcm.demo.app.EventList.Item;
import com.google.android.gcm.demo.app.EventList.NewsRowAdapter;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.ListView;
public class DatabaseSqlite extends Observable {
public static final String KEY_ROWID = "_id";
public static final String KEY_EVENTNAME = "event_name";
public static final String KEY_EVENTSTARTTIME = "event_start_time";
public static final String KEY_EVENTALERTTIME = "event_alert_time";
public static final String KEY_EVENTALERTSTATE = "event_alert_state";
public static final String KEY_EVENTSTATE = "event_state";
public static final String KEY_IDFROMREMOTESERVER = "event_id";
public static final String KEY_LOCATION = "event_location";
public static final String KEY_DATE = "date";
private static final String KEY_ORIGINALALALERTDATE = "original_alert_date";
private static final String KEY_ALERTMINUTES = "alert_in_minutes";
private static final String KEY_ALERTINMILLIS = "alert_in_millis";
// database name:
private static final String DATABASE_NAME = "Reminders_DB";
private static final String DATABASE_TABLE = "Alerts";
private static final int DATABASE_VERSION = 1;
private DBHelper dbHelper;
private final Context context;
private SQLiteDatabase database;
Cursor cursor = null;
ArrayList<String> alertList = null;
List<Alerts> alertsOfList;
ListView listView;
AlertAdapter objAdapter;
// JSONObject json;
private String name = "First time i have this Text";
/**
* @return the value
*/
public String getValue() {
return name;
}
/**
* @param value
* the value to set
*/
public void setValue(String name) {
this.name = name;
setChanged();
notifyObservers();
}
private static class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_IDFROMREMOTESERVER + " INTEGER, " + KEY_EVENTNAME
+ " TEXT, " + KEY_EVENTSTARTTIME + " TEXT, "
+ KEY_EVENTSTATE + " INTEGER," + KEY_LOCATION + " TEXT, "
+ KEY_DATE + " TEXT, " + KEY_EVENTALERTTIME + " TEXT, "
+ KEY_ALERTMINUTES + " TEXT, " + KEY_ALERTINMILLIS
+ " TEXT, " + KEY_ORIGINALALALERTDATE + " TEXT, "
+ KEY_EVENTALERTSTATE + " INTEGER);"
);
System.out.println("database created ");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
System.out.println("DROP TABLE IF EXISTS ");
}
}
public DatabaseSqlite(Context c) {
context = c;
}
public DatabaseSqlite open() throws SQLException {
dbHelper = new DBHelper(context);
database = dbHelper.getWritableDatabase();
System.out.println("database opened " + database);
return this;
}
public void close() {
try {
if (database != null && database.isOpen()) {
dbHelper.close();
System.out.println("database closed ");
// setValue("penny");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public long createEntry(int idFromRemoteServer, String eventName,
String startTime, String alertTime, int alertState,
String location, int eventState, String date) {
ContentValues cv = new ContentValues();
cv.put(KEY_IDFROMREMOTESERVER, idFromRemoteServer);
cv.put(KEY_EVENTNAME, eventName);
cv.put(KEY_EVENTSTARTTIME, startTime);
cv.put(KEY_EVENTALERTTIME, alertTime);
cv.put(KEY_EVENTSTATE, eventState);
cv.put(KEY_EVENTALERTSTATE, alertState);
cv.put(KEY_LOCATION, location);
cv.put(KEY_DATE, date);
return database.insert(DATABASE_TABLE, null, cv);
}
public List<Alerts> getData() {
Cursor cursor = null;
System.out.println("get data is running");
alertsOfList = new ArrayList<Alerts>();
try {
String[] columns = new String[] { KEY_ROWID,
KEY_IDFROMREMOTESERVER, KEY_EVENTNAME, KEY_EVENTSTARTTIME,
KEY_EVENTALERTTIME, KEY_EVENTALERTSTATE, KEY_LOCATION,
KEY_EVENTSTATE, KEY_DATE };
// information from a database is read thru a cursor
cursor = database.query(DATABASE_TABLE, columns, null, null, null,
null, null);
int iRow = cursor.getColumnIndex(KEY_ROWID);
int iIdRemote = cursor.getColumnIndex(KEY_IDFROMREMOTESERVER);
int iEventState = cursor.getColumnIndex(KEY_EVENTSTATE);
int iName = cursor.getColumnIndex(KEY_EVENTNAME);
int iStartTime = cursor.getColumnIndex(KEY_EVENTSTARTTIME);
int iAlertTime = cursor.getColumnIndex(KEY_EVENTALERTTIME);
int iAlertState = cursor.getColumnIndex(KEY_EVENTALERTSTATE);
int iLocation = cursor.getColumnIndex(KEY_LOCATION);
int iDate = cursor.getColumnIndex(KEY_DATE);
if (cursor != null) {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
.moveToNext()) {
Alerts alertObj = new Alerts();
alertObj.setRowId(cursor.getInt(iRow));
alertObj.setRemoteServerId(cursor.getInt(iIdRemote));
alertObj.setEventState(cursor.getInt(iEventState));
alertObj.setAlertState(cursor.getInt(iAlertState));
alertObj.setEventName(cursor.getString(iName));
alertObj.setLocation(cursor.getString(iLocation));
alertObj.setStartTime(cursor.getString(iStartTime));
alertObj.setAlertTime(cursor.getString(iAlertTime));
alertObj.setDate(cursor.getString(iDate));
String result = cursor.getString(iName);
System.out.println(result);
alertsOfList.add(alertObj);
}
}
} catch (Exception e) {
e.printStackTrace();
alertsOfList = null;
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.deactivate();
cursor.close();
cursor = null;
}
}
return alertsOfList;
}
public String getAlertTime(long lRow) {
String result = "";
try {
String[] columns = new String[] { KEY_ROWID + "=" + lRow, KEY_EVENTALERTTIME };
cursor = database.query(DATABASE_TABLE, columns, null, null, null,
null, null);
int iAlertTime = cursor.getColumnIndex(KEY_EVENTALERTTIME);
if (cursor != null) {
cursor.moveToFirst();
result = cursor.getString(iAlertTime);
// System.out.println(" Alert time pulled from server is "
// + result);
}
} catch (Exception e) {
e.printStackTrace();
// alertsOfList = null;
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.deactivate();
cursor.close();
cursor = null;
}
}
System.out.println("---------get alert Time is " + result );
System.out.println("row from time is " + lRow);
return result;
}
public int getAlertState(long lRow) {
Cursor cursor = null;
int result = 0;
try {
String[] columns = new String[] { KEY_ROWID + "=" + lRow , KEY_EVENTALERTSTATE };
// information from a database is read thru a cursor
cursor = database.query(DATABASE_TABLE, columns, null, null, null,
null, null);
int iAlertState = cursor.getColumnIndex(KEY_EVENTALERTSTATE);
if (cursor != null) {
cursor.moveToFirst();
result = cursor.getInt(iAlertState);
}
} catch (Exception e) {
e.printStackTrace();
// alertsOfList = null;
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.deactivate();
cursor.close();
cursor = null;
}
}
System.out.println("---------get alert state is " + result );
System.out.println("row from state is " + lRow);
return result;
}
// ////////////
public List<Alerts> getAlertsforService() {
Cursor cursor = null;
System.out.println("get data is running");
alertsOfList = new ArrayList<Alerts>();
try {
String[] columns = new String[] { KEY_ROWID, KEY_EVENTNAME,
KEY_EVENTSTARTTIME, KEY_EVENTALERTTIME,
KEY_EVENTALERTSTATE, KEY_LOCATION, KEY_EVENTSTATE,
KEY_DATE, KEY_ORIGINALALALERTDATE, KEY_ALERTMINUTES,
KEY_ALERTINMILLIS };
// information from a database is read thru a cursor
cursor = database.query(DATABASE_TABLE, columns, null, null, null,
null, null);
int iRow = cursor.getColumnIndex(KEY_ROWID);
// int iIdRemote = cursor.getColumnIndex(KEY_IDFROMREMOTESERVER);
int iEventState = cursor.getColumnIndex(KEY_EVENTSTATE);
int iName = cursor.getColumnIndex(KEY_EVENTNAME);
int iStartTime = cursor.getColumnIndex(KEY_EVENTSTARTTIME);
int iAlertTime = cursor.getColumnIndex(KEY_EVENTALERTTIME);
int iAlertState = cursor.getColumnIndex(KEY_EVENTALERTSTATE);
int iLocation = cursor.getColumnIndex(KEY_LOCATION);
int iDate = cursor.getColumnIndex(KEY_DATE);
int iOrigAlertDate = cursor.getColumnIndex(KEY_ORIGINALALALERTDATE);
int iMinutes = cursor.getColumnIndex(KEY_ALERTMINUTES);
int iAlertInMills = cursor.getColumnIndex(KEY_ALERTINMILLIS);
if (cursor != null) {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
.moveToNext()) {
if (cursor.getInt(iAlertState) == 0
&& cursor.getString(iAlertInMills) != "") {
Alerts alertObj = new Alerts();
// iOrigAlertDate
//
alertObj.setOrgAlertDate(cursor
.getString(iOrigAlertDate));
alertObj.setAlertMinutes(cursor.getString(iMinutes));
alertObj.setEventState(cursor.getInt(iEventState));
alertObj.setRowId(cursor.getInt(iRow));
alertObj.setAlertInMillis(cursor
.getString(iAlertInMills));
alertObj.setEventState(cursor.getInt(iEventState));
alertObj.setAlertState(cursor.getInt(iAlertState));
alertObj.setEventName(cursor.getString(iName));
alertObj.setLocation(cursor.getString(iLocation));
alertObj.setStartTime(cursor.getString(iStartTime));
alertObj.setAlertTime(cursor.getString(iAlertTime));
alertObj.setDate(cursor.getString(iDate));
alertsOfList.add(alertObj);
}
}
}
} catch (Exception e) {
e.printStackTrace();
alertsOfList = null;
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.deactivate();
cursor.close();
cursor = null;
}
}
return alertsOfList;
}
// //////////
public void updateEventState(long lRow, int eventState) {
// is Event running or canceled
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_EVENTSTATE, eventState);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
public void updateEventStartTime(long lRow, int eventStartTime) {
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_EVENTSTARTTIME, eventStartTime);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
public void updateAlertState(long lRow, int alertState) {
System.out.println(lRow+"---------update alert state is " + alertState);
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_EVENTALERTSTATE, alertState);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
// public void updateEventAlertTime(long lRow, String updateAlertTime) {
// // time update from notification
// System.out.println("----updateEventAlert time is "+updateAlertTime);
// ContentValues updateCV = new ContentValues();
// updateCV.put(KEY_EVENTALERTTIME, updateAlertTime);
// database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
//
//
// }
public void updateAlertTime(long lRow, String updateAlertTime) {
// time update from notification
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_EVENTALERTTIME, updateAlertTime);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
public void updateEventLocation(long lRow, String location) {
// time update from notification
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_LOCATION, location);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
public void updateEventState(long lRow, String state) {
// time update from notification
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_EVENTSTATE, state);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
public void updateDate(long lRow, String state) {
// time update from notification
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_DATE, state);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
public void updateAlertInDB(long lRow, String date, String alertInMillis,
String minutes, String alertTime) {
ContentValues updateCV = new ContentValues();
updateCV.put(KEY_ORIGINALALALERTDATE, date);
updateCV.put(KEY_EVENTALERTTIME, alertTime);
updateCV.put(KEY_ALERTMINUTES, minutes);
updateCV.put(KEY_ALERTINMILLIS, alertInMillis);
System.out.println("------------------"+alertInMillis + " " + date + " " + minutes);
database.update(DATABASE_TABLE, updateCV, KEY_ROWID + "=" + lRow, null);
// setValue("penny");
}
public void deleteEntry(long lRow1) {
// TODO Auto-generated method stub
database.delete(DATABASE_TABLE, KEY_ROWID + "=" + lRow1, null);
// setValue("penny");
}
}
更新
当 Activity 被销毁时,游标会更新。还有其他方法可以从 sqlite 数据库中获取最新数据吗?