2016-05-13 11 views
2

私は、PK_id列と整数列 "CARDNUM"を持つTOTALCOUNTテーブルを持っています。私はCARDNUMのデフォルト値をゼロに設定したいと思います。新しい行がデータベースに挿入されるたびにCARDNUMを+1ずつ増やします。したがって、5行の挿入は、1から5のROWIDに対して1,2,3,4,5を生成します。私がRecyclerView内の個々のCardViewsにデータをプッシュすると、デフォルト値の0だけが得られます。最初の5つのCardViewはCARDNUM値を1,2,3,4,5に表示する必要があります。私はここで何が欠けていますか?Sqlite:行の値を+1するにはどうすればよいですか?

DBContractファイル:

... 
public static final String TABLE_NAME_TOTALCOUNT = "totalcount"; 
    public static final String COLUMN_NAME_COUNTID = "_id"; 
    public static final String COLUMN_NAME_CARDNUM = "cardnum"; 
    } 
} 

    A second table, not shown is called USERINPUTS. 

DBHelperファイル:

... 
public void onCreate(SQLiteDatabase db) { 
    // Set up the Column headings for USERINPUTS and TOTALCOUNT Tables. 
    db.execSQL(SQL_CREATE_ENTRIES); 
    db.execSQL(SQL_CREATE_CARDNUM); 

private static final String SQL_CREATE_CARDNUM = 
    "CREATE TABLE IF NOT EXISTS "+ DBContract.DBEntry.TABLE_NAME_TOTALCOUNT + 
      "("+ DBContract.DBEntry.COLUMN_NAME_COUNTID + 
      " INTEGER PRIMARY KEY , "+ 
      DBContract.DBEntry.COLUMN_NAME_CARDNUM + 
      " INTEGER);"; 

public void insertIntoTableTOTALCOUNT() { 

    SQLiteDatabase db = this.getWritableDatabase(); 

    db.beginTransaction(); 

    String select = "Select * from "+ DBContract.DBEntry.TABLE_NAME_TOTALCOUNT; 

    Cursor c =db.rawQuery(select, null); 
    int cardnum=0; 

    try { 
     if (c.moveToFirst()) { 
      cardnum = c.getInt(1); 
      cardnum++; 
     } 
    } finally { 
     if(c !=null && !c.isClosed()){ 
      c.close(); 
     } 
    } 

    ContentValues cv = new ContentValues(); 
    cv.put(DBContract.DBEntry.COLUMN_NAME_CARDNUM,cardnum); 
    db.insert(DBContract.DBEntry.TABLE_NAME_TOTALCOUNT,null,cv); 

    db.setTransactionSuccessful(); 
    db.endTransaction(); 
    // Close the database. 
    if(db.isOpen()) 
     db.close(); 
} 

... 
// Two Tables push the data to a RecyclerView list. 
public List<UserData> getDataFromDB(){ 
    List<UserData> modelList = new ArrayList<>(); 

    String query = "SELECT *, (SELECT " + DBContract.DBEntry.COLUMN_NAME_CARDNUM + 
      " from " + DBContract.DBEntry.TABLE_NAME_TOTALCOUNT +") from " 
      + DBContract.DBEntry.TABLE_NAME_USERINPUTS +";"; 

    SQLiteDatabase db = this.getReadableDatabase(); 

    db.beginTransaction(); 

    Cursor cursor = db.rawQuery(query, null); 

    Log.d("TAG", DatabaseUtils.dumpCursorToString(cursor)); 

     try { 
      if (cursor.moveToFirst()) { 
       do { 
        UserData userData = new UserData(); 
        userData.setTodo(cursor.getString(1)); 
        userData.setNote1(cursor.getString(2)); 
        userData.setNote2(cursor.getString(3)); 
        userData.setDuedate(cursor.getString(4)); 
        userData.setDuetime(cursor.getString(5)); 
        userData.setTimestamp(cursor.getLong(6)); 
        userData.setCardnum(cursor.getInt(7)); 

        modelList.add(0, userData); 
        } while (cursor.moveToNext()); 
      } 
     } finally { 
       if(cursor !=null && !cursor.isClosed()){ 
       cursor.close(); 
       } 
      } 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
    return modelList; 
}  
+0

この方法を試してみてくださいオートインクリメントされていない主キー値を持つことのポイントは何ですか? –

+0

私は値の列を+1でインクリメントし、デフォルト値は0であると考えています。私はSQLiteを初めて使用しているので、これについて最善の方法を知りません。 – AJW

+0

見てください[ここ](http://stackoverflow.com/questions/6982173/sqlite-auto-increment-non-primary-key-field)。 –

答えて

0

あなたは、テーブルを作成するときに "AUTOINCREMENT" オプションを追加することで簡単に行うことができ、それが自動的に

かによってインクリメントされますあなたの方法は、しかし、あなたが処理するときに行方不明ですカーソル


Cursor c =db.rawQuery(select, null); 
    int cardnum=0; 
c.moveToFirst(); 
while(c != null) 
{ 
cardnum = c.getInt(1); 
      cardnum++; 
c.moveToNext(); 
} 

+0

Android Studioの警告では、「条件」(c!= null)は常にtrueです。 – AJW

+0

最後の行がテーブルの値を持つまでmoveToNext()メソッドがヌルカーソルを返します。 –

+0

アプリケーションがクラッシュします。エラーメッセージに「cardnum = c.getInt(1);」という行に「CursorIndexOutOfBoundsException:Index 0が要求され、サイズが0である」というエラーメッセージが表示されます。 – AJW

関連する問題