2011-09-05 5 views
2

내 앱에 추적 대상 사용자의 이름을 저장하는 하나, 진행중인 이벤트를 추적하기 위해 하나, 더 나은 용어가없는 한 개의 테이블이 포함 된 데이터베이스가 있습니다. 설정 용.getWritableDatabase/getReadableDatabase 이후에 onCreate가 호출되지 않습니다.

앱이 시작될 때 첫 번째 표가로드됩니다. 표시 할 멤버에서로드 할 수있는 읽을 수있는 데이터베이스를 요청하고 나중에 목록이 변경되면 데이터베이스에 씁니다. 나는 여기에 아무런 문제가 없었다.

그러나 다른 두 테이블은 작동하지 않습니다. 도우미 클래스의 코드는 클래스 이름과 열 이름을 제외하고 (적어도 테이블에 액세스하려고 시도 할 때까지) 테이블을 사용하는 코드는 거의 동일합니다. 여기

내 헬퍼 클래스의 코드이다 (I 각 테이블에 대해 별도의 도우미를 가지고, 내가 말했듯이, 그것은 클래스 이름과 열을 제외하고는 동일의) :

여기
public class db_MembersOpenHelper extends SQLiteOpenHelper 
{ 
    public static final String TABLE_NAME = "members_table"; 
    public static final String[] COLUMN_NAMES = new String[] { 
      Constants.KEY_ID, 
      "name", 
      "score" 
    }; 
    private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " (" 
      + COLUMN_NAMES[0] + " INTEGER PRIMARY KEY autoincrement, " 
      + COLUMN_NAMES[1] + " TEXT, " 
      + COLUMN_NAMES[2] + " INTEGER);"; 

    public db_MembersOpenHelper(Context context) 
    { 
     super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { db.execSQL(TABLE_CREATE); } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     Log.w("TaskDBAdapter", "Upgrading from version " + oldVersion + " to " + newVersion + "."); 
     // Do nothing. We do not have any updated DB version 
    } 
} 

내가 그것을 사용하는 방법 성공적으로 : 실패 곳

db_MembersOpenHelper membersDbHelper = new db_MembersOpenHelper(this); 
SQLiteDatabase membersDb = membersDbHelper.getReadableDatabase(); 
Cursor membersResult = membersDb.query(TABLE_NAME, null, null, null, null, null, null); 
members = new HashMap<String, Integer>(); 

membersResult.moveToFirst(); 
for(int r = 0; r < membersResult.getCount(); r++) 
{ 
    members.put(membersResult.getString(1), membersResult.getInt(2)); 
    membersResult.moveToNext(); 
} 
membersDb.close(); 

그리고 여기입니다 : 첫 번째는 같은 작품

db_PlayersOpenHelper playersDbHelper = new db_PlayersOpenHelper(this); 
final SQLiteDatabase playersDb = playersDbHelper.getWritableDatabase(); 
if(newGame) 
{ 
    for(String name : players) 
    { 
     ContentValues row = new ContentValues(); 
     row.put(COLUMN_NAMES[1], name); 
     row.put(COLUMN_NAMES[2], (Integer)null); 
     playersDb.insert(TABLE_NAME, null, row); 
    } 
} 

매력. 두 번째 결과는 ERROR/Database(6739): Error inserting achievement_id=null name=c android.database.sqlite.SQLiteException: no such table: players_table: , while compiling: INSERT INTO players_table(achievement_id, name) VALUES(?, ?); ...

일부 테스트를 수행했으며 작동하지 않는 테이블에 대해서는 onCreate 메서드가 전혀 호출되지 않았습니다. 어떤 이유로 내 전화기가 테이블이 존재하지 않는다고 생각하는지 설명 할 수 있지만, 왜 메소드가 호출되지 않는지 알 수 없습니다.

나는 이것을 이해할 수 없다. 내가 실수로 다른 테이블과 옳은 일을 한 테이블에서 잘못하는 것은 무엇입니까?

답변

5

필자는 세 명의 도우미가있는 세 개의 테이블을 관리하지만 하나의 데이터베이스 만 사용한다고 생각합니다. SQLiteOpenHelper데이터베이스에서 하나의 테이블을 관리하지 않습니다. 예를 들어, 테이블이 아닌 데이터베이스가 시작되는지 여부를 확인합니다. 그것은 이미, 그래서 onCreate() 발사하지 않습니다.

나는 한 명의 도우미로 모든 테이블을 관리 할 것이다.

+0

오, 알았습니다.헬퍼가 어떻게 작동하는지 정확히 이해하지 못했습니다. 고맙습니다. –

0

내가이 권리를 얻는 지 보도록하겠습니다. 세 개의 테이블로 하나의 데이터베이스를 만들려고합니다. 그러나 데이터베이스를 만들 때 하나의 테이블 만 만들면됩니다. 당신은 어떻게 든 다른 장소에서 동일한 데이터베이스를 인스턴스화하고 그 onCreate 메소드가 호출되지 않는지 궁금해합니다. 이것은 올바른 해석입니까?

내 전략은 단일 onCreate() 메서드로 세 테이블 모두를 만들 수 있습니다.

0

여러 테이블로 작업하는 경우 모든 테이블을 한 번에 만들어야합니다. 응용 프로그램을 먼저 실행 한 후 나중에 데이터베이스를 업데이트하면 DB가 업그레이드되지 않습니다.

이제 애플리케이션을 삭제 한 다음 다시 실행하십시오.

+0

http://pheide.com/page/11/tab/24#post13 전체적으로이 링크를 확인하십시오. –

0

해결책이 하나 더 있지만 적절하지 않습니다. onCreate를 호출 할 수있는 onOpen 메서드를 선언 할 수 있습니다. 그리고 create table string에 테이블 이름 앞에 존재하지 않는 경우를 추가하십시오. - Sourabh now now 편집

관련 문제