sql >> データベース >  >> RDS >> SQLite

androidでsqlitedbを正しく設定する

    readPos 代わりに:-

    Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
                    +TABLE_NAME+" WHERE " + _ID +" =? " });
    

    あなたが持っている必要があります:-

    Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
                +TABLE_NAME+" WHERE " + _ID +" =? ",new String[]{_id});
    

    上記のコードは、変更前は完全に正常に機能していました。これで、updatePosは正しい値を返しますが、readPosは常にゼロを返します...

    cursor.getInt(cursor.getColumnIndex(LAST_BTN))を使用する LAST_BTN列の値が数値でない限り、0を返します(文字列を数値に変更できないため、0を返します)。問題の説明から、LAST_BTN列に格納されている値が完全に数値ではない可能性があります。

    • 行を一意に識別する値を取得する場合は、主キーIDとID列を返します。

    また、last_btnを readPosに渡す必要はありません。 メソッドなので、public int readPos(String _id)を使用できます public int readPos(String _id, int last_btn)の代わりに 。

    さらに、カーソルを開いたままにしておくと、開いているカーソルが多すぎるため、アプリがクラッシュします。次のことを検討することをお勧めします:-

    public int readPos(String _id) {
        int rv = 0;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
                +TABLE_NAME+" WHERE " + _ID +" =? ",new String[]{_id});
        if(cursor.moveToFirst()) {
            rv = cursor.getInt(cursor.getColumnIndex(LAST_BTN));
        }
        cursor.close();
        return rv;
    }
    

    ただし、上記の変更では、LAST_BTN列に格納されている値が数値でない場合にreadPosが0を返すという問題は解決されません。 「A1234」の場合、結果は0になり、「1234」の場合、1234が返されます。

    コードを使用して(ただし、推奨されるreadPosメソッドを使用して)、次を使用します。-

        DBHelper dbHelper = new DBHelper(this);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.execSQL("INSERT INTO " + DBHelper.TABLE_NAME
                + "(_id,LAST_BTN,button_no)"
                + "VALUES "
                + "('test1','last_button1','button1')"
                +  ",('test2','last_button2','button2')"
                + ",('test3','last_button3','button3')"
                + ",('test4','199','button4')"
                + ";"
        );
    
        Log.d("DBINFO","Result of readPos for test1 is " + dbHelper.readPos("test1")); // 0 as last_button1 is not a number
        Log.d("DBINFO","Result of readPos for test2 is " + dbHelper.readPos("test2")); // 0 as last_button2 is not a number
        Log.d("DBINFO","Result of readPos for test3 is " + dbHelper.readPos("test3")); // 0 as last_button3 is not a number
        Log.d("DBINFO","Result of readPos for test4 is " + dbHelper.readPos("test4")); // 199 as 199 is a number
        Log.d("DBINFO","Result of readPos for test5 is " + dbHelper.readPos("test5")); // 0 as no row found
    

    結果:-

    D/DBINFO: Result of readPos for test1 is 0
    D/DBINFO: Result of readPos for test2 is 0
    D/DBINFO: Result of readPos for test3 is 0
    D/DBINFO: Result of readPos for test4 is 199
    D/DBINFO: Result of readPos for test5 is 0
    

    つまり、コメントに従って test1-test3 行が見つからなかったためではなく、LAST_BTN列に格納された文字列を数値に変換できないため、0を返します。SQLiteAPIをクラッシュさせる代わりに、0を返します。 test4 LAST_BTNに格納されている値を数値に変換(表現)できるため、が抽出され、0以外の値が返されます。 test5 データベースに存在しないため、行が見つからなかったため0が返されます。




    1. 表の印刷がページサイズに適合しない

    2. 16進数のテキスト文字列をbyteaとしてPostgreSQLに挿入する

    3. SQLINSERTステートメントにPythondictを使用する

    4. MariaDBのAVG()関数