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");
    }
}
アップデート
アクティビティが破棄されると、カーソルが更新されます。sqlite データベースから最新のデータを取得する別の方法はありますか?