2016-10-17 6 views
0

私はSQLiteデータベースに挿入します。挿入は成功しますが、テーブルには面白い動作が表示されます。挿入は常に最初のインデックスで行われ、前のレコードが削除されます(テーブルを再作成してレコードを挿入する動作が表示されます)。私は通常の挿入、すなわち後続のレコードを私のテーブルに挿入する必要があります。SQliteの挿入は常に同じインデックスで行われます

Here is the relevant code 

public class FarmsDbHelper extends SQLiteOpenHelper { 
    String JSON_STRING; 
    private SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
    private final static String LOG_TAG = FarmsDbHelper.class.getSimpleName(); 

    // Database name 
    private final static String DB_NAME = FarmsContract.DATABASE_NAME; 

    // Database version 
    private final static int DB_VERSION = 8; 

    // Farmers table 
    private final static String FARM_TABLE_NAME = FarmsContract.Farms.TABLE_NAME; 
    private final static String FARM_ROW_ID = FarmsContract.Farms.ID; 
    private final static String FARM_ROW_FARM_NAME = FarmsContract.Farms.FARM_NAME; 
    private final static String FARM_ROW_SIZE_WITH_TOBACCO = FarmsContract.Farms.SIZE_WITH_TOBACCO; 
    private final static String FARM_ROW_PLANTING_DATE = FarmsContract.Farms.PLANTING_DATE; 
    private final static String FARM_ROW_FARMER_ID = FarmsContract.Farms.FARMER_ID; 
    private final static String FARM_ROW_SEASON_ID = FarmsContract.Farms.SEASON_ID; 
    private final static String FARM_ROW_IS_SYNCED = FarmsContract.Farms.IS_SYNCED; 
    private final static String FARM_ROW_UPDATED_AT = FarmsContract.Farms.UPDATED_AT; 
    private final static String FARM_ROW_DELETED = FarmsContract.Farms.DELETED; 
    private final static String FARM_ROW_CREATION_DATE = FarmsContract.Farms.CREATION_DATE; 


    // SQL statement to create the Version table 
    private final static String FARM_TABLE_CREATE = 
      "CREATE TABLE " + 
        FARM_TABLE_NAME + " (" + 
        FARM_ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + 
        FARM_ROW_FARM_NAME + " TEXT NULL, " + 
        FARM_ROW_SIZE_WITH_TOBACCO + " TEXT NULL, " + 
        FARM_ROW_PLANTING_DATE + " TEXT NULL, " + 
        FARM_ROW_FARMER_ID + " TEXT NULL, " + 
        FARM_ROW_SEASON_ID + " TEXT NULL, " + 
        FARM_ROW_IS_SYNCED + " TEXT NULL, " + 
        FARM_ROW_UPDATED_AT + " TEXT NULL, " + 
        FARM_ROW_DELETED + " TEXT NULL, " + 
        FARM_ROW_CREATION_DATE + " TEXT NULL" + ");"; 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // Create Version table 
     db.execSQL(FARM_TABLE_CREATE); 
     Log.i(LOG_TAG, "Creating table with query: " + FARM_TABLE_CREATE); 
     //create an async task here for reading from the remote server on database Farms Contract creation 
     new RetrieveFarmsTask().execute(); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     db.execSQL("DROP TABLE IF EXISTS " + FARM_TABLE_NAME); 
     onCreate(db); 

    } 

    @Override 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

    public void insertFarms(FarmsBean farmsBean) { 

     Log.i(LOG_TAG, "Added a farm - " + farmsBean.toString()); 

     // Get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 

     // Create ContentValues to add data 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(FARM_ROW_ID, farmsBean.getId()); 
     contentValues.put(FARM_ROW_FARM_NAME, farmsBean.getFarmName()); 
     contentValues.put(FARM_ROW_SIZE_WITH_TOBACCO, farmsBean.getSizeWithTobacco()); 
     contentValues.put(FARM_ROW_PLANTING_DATE, farmsBean.getPlantingDate().toString()); 
     contentValues.put(FARM_ROW_FARMER_ID, farmsBean.getFarmerId()); 
     contentValues.put(FARM_ROW_SEASON_ID, farmsBean.getSeasonId()); 
     try{ 
      contentValues.put(FARM_ROW_IS_SYNCED, farmsBean.isSynced()); 
      contentValues.put(FARM_ROW_UPDATED_AT, farmsBean.getUpdatedAt().toString()); 
     } 
     catch (Exception ex){ 
      ex.getMessage(); 
     } 
     contentValues.put(FARM_ROW_DELETED, farmsBean.isDeleted()); 
     contentValues.put(FARM_ROW_CREATION_DATE, farmsBean.getCreationDate().toString()); 

     // Insert data to table 
     long farmResult = db.insert(FARM_TABLE_NAME, null, contentValues); 

     // Remember to close the db 
     db.close(); 
    } 
} 


Here is my contract class 

package netcen.client.co.ke.SQLiteDatabase; 

import android.provider.BaseColumns; 

/** 
* Created by CIO on 9/27/2016. 
*/ 
public class FarmsContract implements BaseColumns { 
    public static final String DATABASE_NAME = "uap.db"; 

    /** 
    * Define the Farms table 
    */ 
    public static final class Farms { 

     // Define table name 
     public static final String TABLE_NAME = "farms"; 

     // Define table columns 
     public static final String ID = BaseColumns._ID; 
     public static final String FARM_NAME = "farm_name"; 
     public static final String SIZE_WITH_TOBACCO = "size_with_tobacco"; 
     public static final String PLANTING_DATE = "planting_date"; 
     public static final String FARMER_ID = "farmer_id"; 
     public static final String SEASON_ID = "season_id"; 
     public static final String IS_SYNCED = "is_synced"; 
     public static final String UPDATED_AT = "updated_at"; 
     public static final String DELETED = "deleted"; 
     public static final String CREATION_DATE = "creation_date"; 

     // Define projection for customer table 
     public static final String[] PROJECTION = new String[]{ 
       /*0*/ FarmsContract.Farms.ID, 
       /*1*/ FarmsContract.Farms.FARM_NAME, 
       /*2*/ FarmsContract.Farms.SIZE_WITH_TOBACCO, 
       /*3*/ FarmsContract.Farms.PLANTING_DATE, 
       /*4*/ FarmsContract.Farms.FARMER_ID, 
       /*5*/ FarmsContract.Farms.SEASON_ID, 
       /*6*/ FarmsContract.Farms.IS_SYNCED, 
       /*7*/ FarmsContract.Farms.UPDATED_AT, 
       /*8*/ FarmsContract.Farms.DELETED, 
       /*9*/ FarmsContract.Farms.CREATION_DATE 
     }; 
    } 
} 


Here's where I call the insertion method 

      FarmsBean farmsBean = new FarmsBean(); 
      farm_id = new IdGenerator().generatePin(); 
      farmsBean.setId(farm_id); 
      farmsBean.setFarmName(captured_farmName); 
      farmsBean.setSizeWithTobacco(parseInt(captured_farmSize)); 
      try { 
         farmsBean.setPlantingDate(dateFormatter.parse(captured_date)); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      farmsBean.setFarmerId(parseInt(cur_farmer_id)); 
      farmsBean.setSeasonId(parseInt(cur_season_id)); 
      farmsBean.setDeleted(false); 
      farmsBean.setCreationDate(new Date()); 


      if(farmsBean!=null){ 
       farmsDbHelper.insertFarms(farmsBean); 
      } 
+0

私はこれについて正確にはわかりませんが、代わりに 'CREATE TABLE IF NOT EXISTS'を使うべきではありませんか?これがこの動作を引き起こしているかどうかはわかりません。多分あなたはテーブルを再作成します。 – Opiatefuchs

答えて

1

Opiatefuchsが正解に感謝の意を表します。存在しない場合はテーブルを作成します。私はthis.getWritableDatabase()を使用してSQLiteDatabaseインスタンスを取得するたびに、テーブルが再作成されていました。もう一度お世話になりました。 - APIレベルでは、このリンクから

https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29

getWritableDatabase

追加1 SQLiteDatabase getWritableDatabase() 読み取りと書き込みのために使用するデータベースを作成し、および/または開きます。これが初めて呼び出されると、データベースが開き、onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase、int、int)および/またはonOpen(SQLiteDatabase)が呼び出されます。

私はgetWritableDatabase()を呼び出すたびに、onUpgradeを呼び出していましたが、これはテーブルを削除していました。ドロップテーブルラインにコメントすることが解決策でした。

1

これは、FARM_ROW_IDも設定しているためです。新しいレコードを挿入するときは、この値を設定しないでください。挿入ごとに自動インクリメントさせてください。

+0

うん、それは....イーグルアイシャビール..... – Opiatefuchs

+0

Opiatefuchsそれは正解です。存在しない場合はテーブルを作成します。私はthis.getWritableDatabase()を使用してSQLiteDatabaseインスタンスを取得するたびに、テーブルが再作成されていました。もう一度お世話になりました。 – RicGatsman

+0

自動インクリメントID列への挿入が正常に機能します。値が提供されると挿入され、値が指定されていない場合は最後のID値がインクリメントされます。 – RicGatsman

関連する問題