Android如何在启动时创建数据库(如果不存在),然后在下一次启动时检索它。

26 浏览
0 Comments

Android如何在启动时创建数据库(如果不存在),然后在下一次启动时检索它。

我在使用Android上的SQLite时遇到了问题。

我能够解析XML文件,然后创建一个数据库来存储内容。

创建和插入都正常工作。

我可以在文件浏览器中看到.db文件。

为什么我的最后一个调用checkDataBase()返回false?为什么?

我在一个Android 2.3的模拟器上工作。

我做错了什么吗?

活动:

public class MTGDBActivity extends Activity{
    String currentDBPath = "data/data/rudy.jaumain.mtgdb/databases/MTGCards";
    MTGContainerData mtgcd;
    MTGDatabase mtgdb;
    Button buttonEditions, buttonCollection, buttonDecks;
    View v;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
                this.mtgcd = new MTGContainerData(this);
                if (!this.checkDataBase()) {
                    System.out.println("文件不存在");
                    this.mtgdb = new MTGDatabase(this);
                    this.mtgdb.open();
                    this.mtgcd.loadCards(this.mtgdb);
                    System.out.println("卡片已加载");
                    this.mtgdb.close();
                }
                else{
                    System.out.println("文件存在");
                }
        } catch (Exception e) {
            System.out.println("失败");
        }
        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("数据库不存在");
        }
        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("点击");
                        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("点击");
                        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("点击");
                        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) {
    db.execSQL(CREATE_BDD);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE " + TABLE_CARDS + ";");
    onCreate(db);
}
}

0
0 Comments

问题的原因是需要在应用程序启动时创建数据库,如果数据库不存在的话。解决方法是使用SQLiteOpenHelper类,该类会在数据库不存在时创建数据库,并且可以通过调用getReadableDatabase()和getWritableDatabase()方法来检索数据库实例。通过扩展SQLiteOpenHelper类并重写onCreate()方法,可以在其中执行创建数据库的代码。当问题得到解决后,提问者建议将问题标记为已解决,这样其他有类似问题的用户就可以看到哪个答案对他们有效。

0
0 Comments

问题的原因是在Android应用中创建数据库时,如果数据库不存在,则需要在启动时创建数据库并在下一次启动时检索它。可以通过调用getReadableDatabase()getWriteableDatabase()来创建数据库,如果数据库不存在的话。不需要在实现中使用任何硬编码路径来设置应用程序的数据库。解决方法是参考开发者网站上的NotePad教程,在创建SQLiteOpenHelper类时进行参考。还可以参考这个帖子来了解如何正确处理SQLiteOpenHelper在应用程序的生命周期中的使用。

0