0

これは既知の問題であり、これに関する情報があると確信していますが、正しい答えを見つけることができませんでした。

基本的に、ユーザーが適切と思われる行を削除および挿入できるようにするSQLiteテーブルがあります。ユーザーは行を挿入して削除できますが、問題は、ユーザーが行3(position = 2)を削除した場合、この削除後、そこに新しい行を挿入できなくなることです。エラー19が発生します-#defineSQLITE_CONSTRAINT19/*制約違反のために中止します*/

では、どうすれば行を削除してから、ギャップなしで行を順番に並べ替えることができますか?またはそうでなければ、これにアプローチするための最良の方法は何ですか?

これが私のコードです:

package android.GUI;

import android.GUI.R.string;

public class DBAdapter {

    public static final String KEY_ROWID = "_id";
    public static final String KEY_DATE = "Date";
    public static final String KEY_DAY = "Day";
    public static final String KEY_HOURS = "Hours";
    public static final String KEY_START = "Start";
    public static final String KEY_END = "End";
    public static final String KEY_TOTAL_HOURS = "TotalH";
    public static final String KEY_TOTAL_MINUTES = "TotalM";

    private static final String TAG = "DBAdapter";
    int dbSumHours;
    int dbSumMinutes;

    private static final String DATABASE_NAME = "shifts6";
    private static final String DATABASE_TABLE = "newtimeDate6";
    private static final int DATABASE_VERSION = 2;

    private static final String DATABASE_CREATE = "create table newtimeDate6 (_id integer primary key autoincrement, "
            + "Date text not null, Hours text not null, TotalH text not null, TotalM text not null, Day text not null, Start text not null, End text not null )";

    private final Context context;

    private static DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public DBAdapter(Context ctx) {

        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

    // opens the database
    public DBAdapter open() throws SQLException {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    // closes the database
    public static void close() {
        DBHelper.close();

    }

    // insert a Shift into the database
    public long insertTitle(String Date, String Hour, int TotalH, int TotalM,
            String Day, int ID, String Start, String End) {

        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_DATE, Date);
        initialValues.put(KEY_ROWID, ID);
        initialValues.put(KEY_HOURS, Hour);
        initialValues.put(KEY_TOTAL_HOURS, TotalH);
        initialValues.put(KEY_TOTAL_MINUTES, TotalM);
        initialValues.put(KEY_DAY, Day);
        initialValues.put(KEY_START, Start);
        initialValues.put(KEY_END, End);

        return db.insert(DATABASE_TABLE, null, initialValues);

    }

    public void addToDBTotal(String Date, String Hour, int TotalH, int TotalM,
            String Day, int ID, String Start, String End) {
        dbSumHours = dbSumHours + TotalH;
        dbSumMinutes = dbSumMinutes + TotalM;
        String hour = Hour;
        String date = Date;



        long id = insertTitle(Date, Hour, dbSumHours, dbSumMinutes, Day, ID,
                Start, End);


    }

    // deletes a particular Shifts
    public boolean deleteTitle(long rowId) {
        Boolean deleted = db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;


        return deleted;



    }

    public void deleteAll() {
        this.open();
        this.db.delete(DATABASE_TABLE, null, null);
        Main.C = 1;
    }

    // retrivs all titles
    public Cursor getAllShifts() {

        return db.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_DATE,
                KEY_HOURS, KEY_DAY, KEY_START, KEY_END }, null, null, null,
                null, null);

    }

    public Cursor getSumHours() {

        return db.query(DATABASE_TABLE, new String[] { KEY_TOTAL_MINUTES, KEY_TOTAL_HOURS },
                null, null, null, null, null);

    }




    public static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(DATABASE_CREATE);

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            Log.w(TAG, "Upgrading database from version " + oldVersion + "to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS shifts");
            onCreate(db);

        }
    }

}
4

1 に答える 1

1

自動インクリメントをオフにしてから、行と行ID番号を自分で管理する必要があります。削除後は、その後の各行を読み取り、削除して前の行に再挿入し、最後まで繰り返します。

さて、なぜギャップがないことがそれほど重要なのでしょうか?

そしてそれに近づく最良の方法はそれをしないことです。あなたに何も得ていないその余分なサイクル(ゲイティライフ)。

于 2012-05-23T19:23:10.850 に答える