2012-04-17 5 views
1

안드로이드에서 SQLite 사용에 문제가 있습니다. XML 파일을 구문 분석 한 다음 콘텐츠를 저장할 데이터베이스를 만들 수 있습니다. 생성, 삽입이 정상적으로 작동합니다. 파일 탐색기에서 .db 파일을 볼 수 있습니다.안드로이드 시작시 데이터베이스를 생성하고 다음에 그것을 검색하는 방법 시작시

마지막으로 checkDataBase()를 호출하면 false가 반환됩니다. 왜 ?

Android 2.3 on en emulator에서 작업 중입니다.

내가 잘못 했나요?

활동 :

public class MTGDBActivity extends Activity{ 

    String currentDBPath = "data/data/rudy.jaumain.mtgdb/databases/MTGCards"; 
    MTGContainerData mtgcd; 
    MTGDatabase mtgdb; 

    Button buttonEditions, buttonCollection, buttonDecks; 
    View v; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     try { 
       this.mtgcd = new MTGContainerData(this); 
       if (!this.checkDataBase()) { 
        System.out.println("FILE DOESN'T EXIST"); 
        this.mtgdb = new MTGDatabase(this); 
        this.mtgdb.open(); 
        this.mtgcd.loadCards(this.mtgdb); 
        System.out.println("CARDS LOADED"); 
        this.mtgdb.close(); 
       } 
       else{ 
        System.out.println("FILE DOES EXIST"); 
       } 

     } catch (Exception e) { 
      System.out.println("FAIL"); 
     } 

     System.out.println(this.checkDataBase()); 
     this.setContentView(R.layout.main); 
     this.initialize(); 
    } 

    private boolean checkDataBase() { 
     SQLiteDatabase checkDB = null; 
     try { 
      checkDB = SQLiteDatabase.openDatabase(currentDBPath, null, 
        SQLiteDatabase.OPEN_READONLY); 
      checkDB.close(); 
     } catch (SQLiteException e) { 
      System.out.println("DATABASE DOES NOT EXIST"); 
     } 
     return checkDB != null ? true : false; 
    } 


    public void initialize(){ 
     try{ 

      v = (View)this.findViewById(R.id.mainLayout); 
      v.setBackgroundColor(Color.WHITE); 

      this.buttonEditions = (Button)findViewById(R.id.buttonEdition); 
      this.buttonEditions.setOnClickListener(new OnClickListener(){ 
       @Override 
       public void onClick(View v) { 

        System.out.println("CLICKED"); 
         Intent i = new Intent(v.getContext(), MTGDBEditionsActivity.class); 
         startActivityForResult(i,0); 
       } 
      }); 

      this.buttonCollection = (Button)findViewById(R.id.buttonCollection); 
      this.buttonCollection.setOnClickListener(new OnClickListener(){ 
       @Override 
       public void onClick(View v) { 

        System.out.println("CLICKED"); 
         Intent i = new Intent(v.getContext(), MTGDBCollectionActivity.class); 
         startActivityForResult(i,0); 
       } 
      }); 

      this.buttonDecks = (Button)findViewById(R.id.buttonDecks); 
      this.buttonDecks.setOnClickListener(new OnClickListener(){ 
       @Override 
       public void onClick(View v) { 

        System.out.println("CLICKED"); 
         Intent i = new Intent(v.getContext(), MTGDBDecksActivity.class); 
         startActivityForResult(i,0); 
       } 
      }); 

     } 
     catch(Exception e1){ 
      e1.printStackTrace(); 
     } 

    } 
} 

데이터베이스 :

public class MTGDatabase{ 

private static final String TABLE_CARDS = "table_cards"; 
private static final String COL_ID = "ID"; 
private static final int NUM_COL_ID = 0; 
private static final String COL_NAME = "NAME"; 
private static final int NUM_COL_NAME = 1; 
private static final String COL_EDITION = "EDITION"; 
private static final int NUM_COL_EDITION = 2; 
private static final String COL_RARITY = "RARITY"; 
private static final int NUM_COL_RARITY = 3; 
private static final String COL_MANACOST = "MANACOST"; 
private static final int NUM_COL_MANACOST = 4; 
private static final String COL_NUMBER = "NUMBER"; 
private static final int NUM_COL_NUMBER = 5; 
private static final String COL_COLOR = "COLOR"; 
private static final int NUM_COL_COLOR = 6; 

public int VERSION_BDD = 1; 
private SQLiteDatabase sqldb; 
private MTGDatabaseAdapter mtgbdAdapter; 

public MTGDatabase(Context c) { 
    mtgbdAdapter = new MTGDatabaseAdapter(c, "MTGCards.db", null, VERSION_BDD); 
} 

public void open(){ 
    sqldb = mtgbdAdapter.getWritableDatabase(); 
} 

public void close(){ 
    sqldb.close(); 
} 

public SQLiteDatabase getDatabase(){ 
    return sqldb; 
} 

public long insertCard(MTGCard card){ 
    ContentValues values = new ContentValues(); 
    values.put(COL_NAME, card.getName()); 
    values.put(COL_EDITION, card.getEdition()); 
    values.put(COL_RARITY, card.getRarity()); 
    values.put(COL_MANACOST, card.getManacost()); 
    values.put(COL_NUMBER, card.getNumber()); 
    values.put(COL_COLOR, card.getColor()); 
    return sqldb.insert(TABLE_CARDS, null, values); 
} 

public int updateCard(int id, MTGCard card){ 
    ContentValues values = new ContentValues(); 
    values.put(COL_NAME, card.getName()); 
    values.put(COL_EDITION, card.getEdition()); 
    values.put(COL_RARITY, card.getRarity()); 
    values.put(COL_MANACOST, card.getManacost()); 
    values.put(COL_NUMBER, card.getNumber()); 
    values.put(COL_COLOR, card.getColor()); 
    return sqldb.update(TABLE_CARDS, values, COL_ID + " = " +id, null); 
} 

public int removeCardWithID(int id){ 
    return sqldb.delete(TABLE_CARDS, COL_ID + " = " +id, null); 
} 

public MTGCard getCardWithName(String name){ 
    Cursor c = sqldb.query(TABLE_CARDS, new String[] {COL_ID, COL_NAME, COL_EDITION, COL_RARITY, COL_MANACOST, COL_NUMBER, COL_COLOR}, COL_NAME + " LIKE \"" + name +"\"", null, null, null, null); 
    return cursorToCard(c); 
} 


private MTGCard cursorToCard(Cursor c){ 

    if (c.getCount() == 0) 
     return null; 

    c.moveToFirst(); 

    MTGCard card = new MTGCard(); 
    card.setId(c.getInt(NUM_COL_ID)); 
    card.setName(c.getString(NUM_COL_NAME)); 
    card.setEdition(c.getString(NUM_COL_EDITION)); 
    card.setRarity(c.getString(NUM_COL_RARITY)); 
    card.setManacost(c.getString(NUM_COL_MANACOST)); 
    card.setNumber(c.getString(NUM_COL_NUMBER)); 
    card.setColor(c.getString(NUM_COL_COLOR)); 

    c.close(); 

    return card; 
} 
} 

데이터베이스 어댑터 :

public class MTGDatabaseAdapter extends SQLiteOpenHelper { 
private static final String TABLE_CARDS = "table_cards"; 
private static final String COL_ID = "_ID"; 
private static final String COL_NAME = "NAME"; 
private static final String COL_EDITION = "EDITION"; 
private static final String COL_RARITY = "RARITY"; 
private static final String COL_MANACOST = "MANACOST"; 
private static final String COL_NUMBER = "NUMBER"; 
private static final String COL_COLOR = "COLOR"; 

private static final String CREATE_BDD = "CREATE TABLE " 
    + TABLE_CARDS 
+ " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
+ COL_NAME + " TEXT NOT NULL, " 
+ COL_EDITION + " TEXT NOT NULL, " 
+ COL_RARITY + " TEXT NOT NULL, " 
+ COL_MANACOST + " TEXT NOT NULL, " 
+ COL_NUMBER + " TEXT NOT NULL, " 
+ COL_COLOR + " TEXT NOT NULL);"; 

public MTGDatabaseAdapter(Context context, String name, 
     CursorFactory factory, int version) { 
    super(context, name, factory, version); 
} 

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

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE " + TABLE_CARDS + ";"); 
    onCreate(db); 
} 
} 
+0

'checkDataBase()'를 실행할 때 디버거에서 보여줄 내용은 무엇입니까? –

+0

System.out.println 대신 checkDataBase()'Log.e ("tag", "DATABASE DOES NOT EXIST", e);를 입력하면 예외가 출력됩니다. – zapl

+0

고마워요, 저 바보예요! – Rudz17

답변

0

데이터베이스 이름이 다른 (확장 현명한).

변경 : 이것에

String currentDBPath = "data/data/rudy.jaumain.mtgdb/databases/MTGCards"; 

:

String currentDBPath = "data/data/rudy.jaumain.mtgdb/databases/MTGCards.db"; 

는 * 당신이 당신의 데이터베이스의 파일 이름에 .DB 누락 있습니다

나는 SQLiteOpenHelper를 사용하도록 권합니다
+0

경로가 필요하거나 권장되도록 하드 코딩하고 있습니까? 기기마다 다를 수 있습니까? –

+1

또한 100 % 확실하지는 않지만'데이터 '앞에'/'가 필요하다고 생각합니다. –

5

수업 : http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

이 클래스는 데이터베이스가 존재하지 않을 경우 데이터베이스를 생성합니다.이 경우 onCreate() 메서드의 코드가 실행되므로 SQLiteOpenHelper 클래스를 확장하면이 클래스를 재정의 할 수 있습니다.

getReadableDatabase()getWritableDatabase() 메서드를 호출하여 데이터베이스 인스턴스를 검색 할 수 있습니다.

+0

감사합니다. 나는 그것을 처리했다! 매력처럼 일했습니다! – Rudz17

+2

사용하신 답이 맞다면 대답 옆에있는 틱 아이콘을 클릭하여 수락 할 수 있습니까? 이 방법을 사용하면 유사한 질문을 가진 다른 사용자가 자신을 위해 어떤 대답이 효과가 있었는지 쉽게 볼 수 있습니다. 이것은 또한 Stackoverflow에 대한 다른 질문에 적용됩니다. –

2

SQLiteOpenHelper 인스턴스의 getReadableDatabase() 또는 getWriteableDatabase()을 호출하면 아직 데이터베이스가 생성되지 않은 경우 데이터베이스가 만들어집니다. 응용 프로그램의 데이터베이스를 설정하기 위해 구현에 하드 코딩 된 경로가 필요하지 않습니다. "XML 구문 분석"으로 무엇을하려고하는지 잘 모르겠습니다.

SQLiteOpenHelper 클래스를 만들 때 개발자 사이트의 NotePad tutorial을 참조하십시오.

SQLiteOpenHelper을 응용 프로그램의 수명주기 동안 올바르게 처리하는 방법에 대한 정보는 post을 참조하십시오.

관련 문제