2014-12-27 2 views
0

두 개의 테이블이 있습니다. 하나는 기본 키이고 다른 하나는 외래 키가있는 테이블입니다.외래 키 (android sqlite)가있는 레코드를 삽입 할 수 없습니다.

첫 번째 항목에 항목을 추가하고 두 번째 항목에 항목을 추가하려고합니다.

내 조각 코드 :

  long phoneNewId = phoneDal.addItem(newPhone); 
      if (phoneNewId != 0) { 
       String comment = ((EditText)rootView.findViewById(R.id.comment_text)).getText().toString(); 
       commentDal.addItem(phoneNewId, comment); 
      } 

PhoneDal :

public class PhoneDal extends SQLiteOpenHelper { 

    // Database Version 
    private static final int DATABASE_VERSION = 1; 
    // Database Name 
    private static final String DATABASE_NAME = Constants.DB_NAME; 

    public static final String BLOCKED_PHONES_TABLE = "BLOCKED_PHONES_TABLE"; 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // SQL statement to create book table 

     String CREATE_BLOCKED_PHONES_TABLE = 
       "CREATE TABLE "+ BLOCKED_PHONES_TABLE + 
         " ("+ KEY_ID+" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL DEFAULT 1, " 
         + KEY_PHONE+" TEXT, " 
          + KEY_IS_BLOCKED+" BIT)"; 

     db.execSQL(CREATE_BLOCKED_PHONES_TABLE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (newVersion > oldVersion) { 
      Log.w("MyAppTag", "Updating database from version " + oldVersion 
        + " to " + newVersion + " .Existing data will be lost."); 
      // Drop older books table if existed 
      db.execSQL("DROP TABLE IF EXISTS " + BLOCKED_PHONES_TABLE); 

      // create fresh books table 
      this.onCreate(db); 
     } 

    } 



    private static final String KEY_ID = "id"; 
    private static final String KEY_PHONE = "KEY_PHONE"; 
    private static final String KEY_IS_BLOCKED = "KEY_IS_BLOCKED"; 

    public long addItem(Phone phone) { 
     Log.d(Constants.LOGGER_TAG, "add saved-offer"); 
     // 1. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 

     // 2. create ContentValues to add key "column"/value 
     ContentValues values = new ContentValues(); 
     //values.put(KEY_ID, phone.id); 
     values.put(KEY_PHONE, phone.phone); 
     values.put(KEY_IS_BLOCKED, phone.isBlocked); 

     // 3. insert 
     long newRowId = 
       db.insertWithOnConflict(BLOCKED_PHONES_TABLE, KEY_ID, 
       values, SQLiteDatabase.CONFLICT_REPLACE); 

     // 4. close 
     db.close(); 
     return newRowId; 
    } 

CommentDal :

public class CommentDal extends SQLiteOpenHelper { 

    // Database Version 
    private static final int DATABASE_VERSION = 1; 
    // Database Name 
    private static final String DATABASE_NAME = Constants.DB_NAME; 

    private static final String COMMENTS_TABLE = "COMMENTS_TABLE"; 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // SQL statement to create book table 

     String CREATE_COMMENTS_TABLE = 
       "CREATE TABLE " + COMMENTS_TABLE + 
         " ("+ KEY_ID+" INTEGER, " 
          + KEY_COMMENT_TEXT+" TEXT " 
          + "FOREIGN KEY("+KEY_ID+") REFERENCES "+PhoneDal.BLOCKED_PHONES_TABLE+"("+KEY_ID+"))"; 

     db.execSQL(CREATE_COMMENTS_TABLE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (newVersion > oldVersion) { 
      Log.w("MyAppTag", "Updating database from version " + oldVersion 
        + " to " + newVersion + " .Existing data will be lost."); 
      // Drop older books table if existed 
      db.execSQL("DROP TABLE IF EXISTS " + COMMENTS_TABLE); 

      // create fresh books table 
      this.onCreate(db); 
     } 
    } 


    private static final String KEY_ID = "id"; 
    private static final String KEY_COMMENT_TEXT = "KEY_COMMENT_TEXT"; 

    public void addItem(long phoneID, String comment) { 
     Log.d(Constants.LOGGER_TAG, "add saved-offer"); 
     // 1. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 

     // 2. create ContentValues to add key "column"/value 
     ContentValues values = new ContentValues(); 
     values.put(KEY_ID, phoneID); 
     values.put(KEY_COMMENT_TEXT, comment); 

     // 3. insert 
     long newRowId = db.insertWithOnConflict(COMMENTS_TABLE, KEY_ID, values, 
       SQLiteDatabase.CONFLICT_REPLACE); 

     // 4. close 
     db.close(); 
    } 
} 

하지만 난이 오류 : 심지어 내 응용 프로그램을 다시 설치 한 후

Process: com.example.stopcall.app, PID: 4720 
android.database.sqlite.SQLiteException: no such table: COMMENTS_TABLE (code 1): , while compiling: INSERT OR REPLACE INTO COMMENTS_TABLE(id,KEY_COMMENT_TEXT) VALUES (?,?) 
     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113) 
     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690) 
     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1601) 
     at com.example.stopcall.app.dal.CommentDal.addItem(CommentDal.java:69) 
     at com.example.stopcall.app.ItemDetailFragment$2.onClick(ItemDetailFragment.java:111) 
+0

댓글 테이블의 정확한 이름을 알려주시겠습니까? –

답변

1

SQLiteOpenHelper를 확장하고 동일한 데이터베이스 이름과 버전을 갖는 두 가지 클래스가 있습니다. 하지만 안드로이드는 그것을 모른다. PhoneDal에 처음 액세스하면 데이터베이스가 생성됩니다. CommentDal에 액세스 할 때 Android는 이미 그 이름과 버전을 가진 데이터베이스를 가지고 있음을 알기 때문에 Comment Dal의 onCreate를 호출하지 않으며 주석 테이블도 생성되지 않습니다.

전화를 추가하고 설명을 추가하는 데 몇 가지 방법이있는 Dal을 하나만 가져야합니다.

1

동일한 데이터베이스 이름을 사용하는 두 개의 SQLiteOpenHelper이 있습니다. 데이터베이스 파일 당 하나의 도우미 클래스 만 사용하십시오.

데이터베이스가 이미 존재하기 때문에 databse가 한 도우미에 의해 설정되고 다른 도우미의 lifecycle 콜백이 호출되지 않습니다.

관련 문제