Android如何在启动时创建数据库(如果不存在),然后在下一次启动时检索它。
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); } }