在Sqlite Android应用程序中的多个表中插入内容值

时间:2017-01-19 00:47:44

标签: java android sqlite

我是SQLite数据库中多个表的新手,我正在尝试找出将值插入多个表的最佳做法。我的主要问题是我是否需要创建另一个ContentValues对象以将值插入第二个表?我真的很难理解如何执行insert()。这是我到目前为止所做的尝试。

以下是两个表和架构

/* 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+"))";

以下是我想要用于insert()的方法,其中包含一些类getters()用于Weld类,我将其作为参数传入。

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;
        }
    }

DBColCons.GPS_POINTDBColCons.EXISTING_GRADE_GPS_POINTDBColCons.GPS_COVERDBColCons.NOTES的值是我想要插入Common_Attributes_Table的值。这是我真的很困惑的地方。我是否需要为这些特定值创建单独的ContentValues对象,并使用单独的db.insert()方法将其插入到所需的表中,以及我已经在WELD_TABLE上使用插入的那个?

帮助我在这次火车失事中迷路了。哈。 谢谢大家。

1 个答案:

答案 0 :(得分:1)

您需要为要插入值的每个表调用insert()(或insertWithConflict())。除非值相同,否则这意味着每个表需要另外ContentValue个。

如果您打算将这些插入提交为单个原子操作,请考虑使用事务。

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