2017-01-19 6 views
0

SQLiteデータベースの複数のテーブルに新しいものがあり、複数のテーブルに値を挿入するためのベストプラクティスが何であるかを調べようとしています。私の主な質問は、別のContentValuesオブジェクトを作成して2番目のテーブルに値を挿入する必要があるかどうかです。私は実際にinsert()を実行する方法を困惑しています。これまで私が試みてきたことがあります。ここでSqliteのAndroidアプリケーションで複数のテーブルにコンテンツ値を挿入する

は、ここでは、2つのテーブルとスキーマ

/* Creating a common attributes table here. */ 
    private static final String CREATE_COMMON_ATTRIBUTES_TABLE = "create table " 
      + COMMON_ATTRIBUTES_TABLE + "(" + DBColCons.UID_COMMON_ATTRIBUTES + " integer" + 
      " primary key autoincrement, " + DBColCons.GPS_POINT+ " integer not null, " 
      + DBColCons.EXISTING_GRADE_GPS_POINT+ " integer not null, " 
      + DBColCons.COVER+ " real not null, "+ DBColCons.NOTES+ " text, " 
      + DBColCons.DATE+ " text)"; 

    /* Creating a weld table here */ 
    private static final String CREATE_WELD_TABLE = " create table " +WELD_TABLE+ "(" 
      + DBColCons.UID_WELD + " integer primary key, " + DBColCons.WELD_TYPE + 
      " text, " + DBColCons.WELD_ID + " text, " + DBColCons.DOWNSTREAM_JOINT + 
      " text, " + DBColCons.UPSTREAM_JOINT + " text, " + DBColCons.HEAT_AHEAD + 
      " text, " + DBColCons.LENGTH_AHEAD + " real, " + DBColCons.WALL_CHANGE + 
      " text, " + DBColCons.WELD_WALL_THICKNESS + " text, " 
      + DBColCons.WELDER_INITIALS + " text, foreign key("+DBColCons.WELD_ID+") references" + 
      "("+DBColCons.GPS_POINT+"))"; 

ある私は、パラメータとして渡しています溶接クラスのためのいくつかのクラスgetters()、とinsert()に使用したいと思っています方法です。 DBColCons.GPS_POINTDBColCons.EXISTING_GRADE_GPS_POINTDBColCons.GPS_COVERDBColCons.NOTESため

public boolean insertWeld(Weld weld) { 
     /* Get a writable copy of the database */ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     /* Content values to insert with Weld class setters */ 
     ContentValues contentValuesWeld = new ContentValues(); 
     try { 
      contentValuesWeld.put(DBColCons.GPS_POINT, weld.getGpsPoint()); 
      contentValuesWeld.put(DBColCons.WELD_TYPE, weld.getWeldType()); 
      contentValuesWeld.put(DBColCons.WELD_ID, weld.getWeldId()); 
      contentValuesWeld.put(DBColCons.DOWNSTREAM_JOINT, weld.getDownstreamJoint()); 
      contentValuesWeld.put(DBColCons.UPSTREAM_JOINT, weld.getUpstreamJoint()); 
      contentValuesWeld.put(DBColCons.HEAT_AHEAD, weld.getHeatAhead()); 
      contentValuesWeld.put(DBColCons.LENGTH_AHEAD, weld.getLengthAhead()); 
      contentValuesWeld.put(DBColCons.EXISTING_GRADE_GPS_POINT, weld.getExistingGradePoint()); 
      contentValuesWeld.put(DBColCons.COVER, weld.getCover()); 
      contentValuesWeld.put(DBColCons.WALL_CHANGE, weld.getWallChange()); 
      contentValuesWeld.put(DBColCons.WELD_WALL_THICKNESS, weld.getWeldWallThickness()); 
      contentValuesWeld.put(DBColCons.WELDER_INITIALS, weld.getWelderInitials()); 
      contentValuesWeld.put(DBColCons.NOTES, weld.getNotes()); 
      /* adding the date in here to the row. */ 
      contentValuesWeld.put(DBColCons.DATE, String.valueOf(mStrDate)); 
      /* Inserting into the weld table */ 
      db.insertWithOnConflict(WELD_TABLE, DBColCons.WELDER_INITIALS, contentValuesWeld, 
        SQLiteDatabase.CONFLICT_NONE); 
      return true; 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

値が、私はCommon_Attributes_Tableに挿入したいものです。これは私が本当に混乱しているところです。これらの特定の値に対して個別のContentValuesオブジェクトを作成し、別のdb.insert()メソッドを使用してそれらを希望のテーブルに挿入する必要がありますか?WELD_TABLEの挿入で既に使用しています。

私はこの列車の難破船で迷子になってしまいました。 Ha。 ありがとうございます。

+0

表示されるエラーは何ですか? – MuTiny

+0

正確に同じレコードを複数のテーブルに挿入する予定ですか?もしそうなら、あなたはデータベースデザインを考え直すことができます。 –

+0

@falsify。私はまだ何も実行していないのでエラーはありません。私はより多くのものを続けていく前に正しいものを得たいと思っています。申し訳ありませんが、より具体的にすべきでした。 @ Tim Biegeleisen。 – J2112O

答えて

1

値を挿入するテーブルごとに(またはinsertWithConflict())に電話する必要があります。値が同じでない限り、これはテーブルごとに別のContentValueが必要であることを意味します。

これらの挿入を1つのアトミック操作としてコミットする場合は、トランザクションの使用を検討してください。

SQLiteDatabase db = ...; 
db.beginTransaction(); 
try { 
    // do your inserts/etc. here 
    db.setTransactionSuccessful(); 
} finally { 
    db.endTransaction(); 
} 
+0

ありがとうございます。私があなたが提案したようにこれをやろうとします。ありがとう。 – J2112O

関連する問題