0

DBのトランザクションテーブルの行を更新しようとしているアプリがあります。これが表です。

//table transactions column names
    public static final String C_ID = BaseColumns._ID; // special for id internally in system
    public static final String C_TYPE = "type";
    public static final String C_COMPANY_ID = "companyid";
    public static final String C_PERSON_ID = "person";
    public static final String C_NAME = "name";
    public static final String C_TAG_ID = "tagid";
    public static final String C_STATUS = "status";
    public static final String C_TAG_SCAN_TIME = "tagscantime";
    public static final String C_TAG_SENTSERVER_TIME = "tagsentservertime";
    public static final String C_TRANSACTIONS_LATITUDE = "transactionslatitude";
    public static final String C_TRANSACTIONS_LONGITUDE = "transactionslongitude";

このテーブルに行を挿入すると、列C_TAG_SENTSERVER_TIMEがnullに設定されます。これは、この時点でトランザクションをWebサービスに投稿していないためです。サーバーから応答が返ってきたら、電話のDBの行を「サーバー時間に送信」で更新したいと思います。現時点では、DBの最後の行を取得しようとしています。次に、その行のIDを取得しようとしています。これは、行を更新するメソッドに渡されます。現在の結果

String[] param = {c.getString(c.getColumnIndex(LoginValidate.C_ID))};

returnignullです。残りの更新メソッドは次のとおりです。上記の呼び出しがnullを返すのはなぜですか?

public void updateTransactionWithServerTime(DateTime sentToServerAt) {

        SQLiteDatabase db = dbhelper.getWritableDatabase();

        Cursor c = null;

        c = db.query(DBHelper.TABLETRANSACTIONS, null, null, null, null, null, null);

        if (c != null ) {
            if  (c.moveToLast()) {
                String[] param = {c.getString(c.getColumnIndex(LoginValidate.C_ID))};
                Log.e(TAG, "C_ID = " + param[0]);
                ContentValues values = new ContentValues();
                  values.put(C_TAG_SENTSERVER_TIME, sentToServerAt.getMillis());

                 int res =  db.update(DBHelper.TABLETRANSACTIONS, values, LoginValidate.C_ID+"=?", param[0]);

                  Log.e(TAG, "done the update on trans table num of rows affected is " + res);

            }

         }
        c.close();
        db.close();
    }//end of updateTransactionWithServerTime

[編集1]

private class DBHelper extends SQLiteOpenHelper {

        // database name and version number
        public static final String DB_NAME = "carefreemobiledb.db";
        public static final int DB_VERSION = 26;

        //table names
        public static final String TABLETRANSACTIONS = "transactions";
        public static final String TABLECARER = "carer";
        public static final String TABLETRANSACTIONSMAP = "transactionsmap";
        public static final String TABLEPHONE = "phone";

        // public static final String C_ID = BaseColumns._ID; // special for id
        // internally in
        // system


        public DBHelper() {
            super(context, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            String sqlToCreateTransactionsTable = String
                    .format("create table %s ( %s INT primary key, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT," +
                            " %s TEXT, %s TEXT, %s INT, %s TEXT, %s TEXT )",
                            TABLETRANSACTIONS, C_ID, C_TYPE, C_COMPANY_ID, C_PERSON_ID,
                            C_NAME, C_TAG_ID, C_STATUS, C_TAG_SCAN_TIME, C_TAG_SENTSERVER_TIME,
                            C_TRANSACTIONS_LATITUDE, C_TRANSACTIONS_LONGITUDE);

            db.execSQL(sqlToCreateTransactionsTable);
            Log.e(TAG, "oncreate " + sqlToCreateTransactionsTable);
4

3 に答える 3

0
String [] str new String[c.getCount()];
int i = 0;
            while (c.moveToNext()) {
                str[i] = c.getString(c.getColumnIndex(LoginValidate.C_ID));
                i++;
            }
于 2012-10-18T13:38:03.220 に答える
0

テーブルに実際にその列が含まれていると仮定すると、カーソルからIDを読み取るコードは正しいように見えます。

とにかく、1つの値を取得するためだけにテーブルのすべての行のすべてのフィールドを読み取ることは非効率的であり、ORDER BY。がないと、最新のレコードが最後のレコードであるという保証はありません。

最後のIDを読み取るには、このクエリをお勧めします。

cursor = db.rawQuery("SELECT max(" + LoginValidate.C_ID + ")" +
                     " FROM " + DBHelper.TABLETRANSACTIONS, null);

ただし、これをサブクエリとして更新クエリに直接プラグインできます。

int res = db.update(DBHelper.TABLETRANSACTIONS, values,
                    LoginValidate.C_ID + " = " +
                     "(SELECT max("+LoginValidate.C_ID+")" +
                     " FROM " + DBHelper.TABLETRANSACTIONS + ")", null);
于 2012-10-18T13:56:05.087 に答える
0

INTEGER PRIMARY KEY自動インクリメント列を取得するには、を使用する必要があります。INT十分ではありません。

于 2012-10-18T15:59:25.510 に答える