如何的Andr​​oid上创建启动数据库,如果它不存在,然后检索它旁边创业 [英] Android How to create database on Startup if it doesn't exist and then retrieve it on next Startups

查看:183
本文介绍了如何的Andr​​oid上创建启动数据库,如果它不存在,然后检索它旁边创业的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Android上使用的SQLite遇到麻烦。
我能够解析XML文件,然后创建一个数据库来存储内容。
创作,插入正常工作。
我可以看到.db文件中的文件管理器

我要checkDataBase()最后一次调用返回false?!为什么呢?

我的工作在Android 2.3上的连接仿真器。

我是不是做错了什么?

活动:

 公共类MTGDBActivity延伸活动{    字符串currentDBPath =数据/数据​​/ rudy.jaumain.mtgdb /数据库/ MTGCards
    MTGContainerData mtgcd;
    MTGDatabase mtgdb;    按钮buttonEditions,buttonCollection,buttonDecks;
    视图V;    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        尝试{
                this.mtgcd =新MTGContainerData(本);
                如果(!this.checkDataBase()){
                    的System.out.println(文件不存在);
                    this.mtgdb =新MTGDatabase(本​​);
                    this.mtgdb.open();
                    this.mtgcd.loadCards(this.mtgdb);
                    的System.out.println(卡片装);
                    this.mtgdb.close();
                }
                其他{
                    的System.out.println(文件不存在);
                }        }赶上(例外五){
            的System.out.println(失败);
        }        的System.out.println(this.checkDataBase());
        this.setContentView(R.layout.main);
        this.initialize();
    }    私人布尔checkDataBase(){
        SQLiteDatabase CHECKDB = NULL;
        尝试{
            CHECKDB = SQLiteDatabase.openDatabase(currentDBPath,空,
                    SQLiteDatabase.OPEN_READONLY);
            checkDB.close();
        }赶上(SQLiteException E){
            的System.out.println(数据库中不存在);
        }
        返回CHECKDB!= NULL?真假;
    }
    公共无效的initialize(){
        尝试{            V =(查看)this.findViewById(R.id.mainLayout);
            v.setBackgroundColor(Color.WHITE);            this.buttonEditions =(按钮)findViewById(R.id.buttonEdition);
            this.buttonEditions.setOnClickListener(新OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){                    的System.out.println(点击);
                        意图I =新意图(v.getContext(),MTGDBEditionsActivity.class);
                        startActivityForResult(I,0);
                }
            });            this.buttonCollection =(按钮)findViewById(R.id.buttonCollection);
            this.buttonCollection.setOnClickListener(新OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){                    的System.out.println(点击);
                        意图I =新意图(v.getContext(),MTGDBCollectionActivity.class);
                        startActivityForResult(I,0);
                }
            });            this.buttonDecks =(按钮)findViewById(R.id.buttonDecks);
            this.buttonDecks.setOnClickListener(新OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){                    的System.out.println(点击);
                        意图I =新意图(v.getContext(),MTGDBDecksActivity.class);
                        startActivityForResult(I,0);
                }
            });        }
        赶上(例外E1){
            e1.printStackTrace();
        }    }
}

数据库:

 公共类MTGDatabase {私有静态最后弦乐TABLE_CARDS =table_cards;
私有静态最后弦乐COL_ID =ID;
私有静态最终诠释NUM_COL_ID = 0;
私有静态最后弦乐COL_NAME =NAME;
私有静态最终诠释NUM_COL_NAME = 1;
私有静态最后弦乐COL_EDITION =版;
私有静态最终诠释NUM_COL_EDITION = 2;
私有静态最后弦乐COL_RARITY =稀有性;
私有静态最终诠释NUM_COL_RARITY = 3;
私有静态最后弦乐COL_MANACOST =耗魔;
私有静态最终诠释NUM_COL_MANACOST = 4;
私有静态最后弦乐COL_NUMBER =数字;
私有静态最终诠释NUM_COL_NUMBER = 5;
私有静态最后弦乐COL_COLOR =COLOR;
私有静态最终诠释NUM_COL_COLOR = 6;公众诠释VERSION_BDD = 1;
私人SQLiteDatabase SQLDB;
私人MTGDatabaseAdapter mtgbdAdapter;公共MTGDatabase(上下文C){
    mtgbdAdapter =新MTGDatabaseAdapter(C,MTGCards.db,空,VERSION_BDD);
}公共无效的open(){
    SQLDB = mtgbdAdapter.getWritableDatabase();
}公共无效的close(){
    sqldb.close();
}公共SQLiteDatabase getDatabase(){
    返回SQLDB;
}众长insertCard(MTGCard卡){
    ContentValues​​值=新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());
    返回sqldb.insert(TABLE_CARDS,空,价值);
}公众诠释updateCard(INT ID,MTGCard卡){
    ContentValues​​值=新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());
    返回sqldb.update(TABLE_CARDS,价值观,COL_ID +=+ ID,NULL);
}公众诠释removeCardWithID(INT ID){
    返回sqldb.delete(TABLE_CARDS,COL_ID +=+编号,零);
}公共MTGCard getCardWithName(字符串名称){
    光标C = sqldb.query(TABLE_CARDS,新的String [] {COL_ID,COL_NAME,COL_EDITION,COL_RARITY,COL_MANACOST,COL_NUMBER,COL_COLOR},COL_NAME +LIKE \\+名字+\\,NULL,NULL,NULL,空值);
    返回cursorToCard(C);
}
私人MTGCard cursorToCard(光标C){    如果(c.getCount()== 0)
        返回null;    c.moveToFirst();    MTGCard卡=新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();    返回卡;
}
}

数据库适配器:

 公共类MTGDatabaseAdapter扩展SQLiteOpenHelper {
私有静态最后弦乐TABLE_CARDS =table_cards;
私有静态最后弦乐COL_ID =_ID;
私有静态最后弦乐COL_NAME =NAME;
私有静态最后弦乐COL_EDITION =版;
私有静态最后弦乐COL_RARITY =稀有性;
私有静态最后弦乐COL_MANACOST =耗魔;
私有静态最后弦乐COL_NUMBER =数字;
私有静态最后弦乐COL_COLOR =COLOR;私有静态最后弦乐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);;公共MTGDatabaseAdapter(上下文的背景下,字符串名称,
        CursorFactory工厂,诠释的版本){
    超(背景下,名称,厂家,版本);
}@覆盖
公共无效的onCreate(SQLiteDatabase DB){
    // TODO自动生成方法存根
    db.execSQL(CREATE_BDD);}@覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
    db.execSQL(DROP TABLE+ TABLE_CARDS +);
    的onCreate(DB);
}
}


解决方案

我会建议你使用SQLiteOpenHelper类:的http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

这个类将创建数据库,如果它不存在,因为这会在的onCreate()方法,你可以,如果你重写执行code扩展SQLiteOpenHelper类。

您可以通过调用检索数据库实例的 getReadableDatabase() getWritableDatabase()方法。

I am having trouble using SQLite on Android. I am able to parse a XML file and then create a database to store the content. Creation, insertion works fine. I can see the .db File in the File Explorer

My last call to checkDataBase() returns false ?! Why ?

I am working on Android 2.3 on en emulator.

Am I doing something wrong ?

Activity:

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();
        }

    }
}

Database:

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;
}
}

Database Adapter:

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);
}
}

解决方案

I would advise you to use the SQLiteOpenHelper class: http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

This class will create the database if it does not exist, for this it will execute code in the onCreate() method, which you can override if you extend the SQLiteOpenHelper class.

You can retrieve a database instance by calling the getReadableDatabase() and getWritableDatabase() methods.

这篇关于如何的Andr​​oid上创建启动数据库,如果它不存在,然后检索它旁边创业的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆