Пересоздание таблиц в SQLite - PullRequest
       2

Пересоздание таблиц в SQLite

3 голосов
/ 28 сентября 2011

При реализации функции сохранения / загрузки моей базы данных я отбросил таблицы, чтобы посмотреть, может ли мое приложение обработать создание таблиц, если это необходимо - ну, это не может

Так что в onCreate моейДля большей эффективности я создаю экземпляр DB, который создает в своем конструкторе экземпляр DBOpenHelper.В основном, когда экземпляр DBOpenHelper вызывает getWritableDatabase (), должно выполняться onCreate DBOpenHelper, создавая таблицы в моей базе данных.Я думаю, что проблема в том, что getWritableDatabase () не вызывается, потому что сама база данных уже существует - думаю, я читал что-то вроде этого метода, поглощенного функцией openOrCreateDatabase.

Как я могу убедиться,что таблицы воссоздаются, если не существуют, без необходимости каждый раз удалять и заново создавать базу данных?

DBOpenhelper:

public class DBOpenHelper extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1;
public static String DATABASE_NAME = "RTDB";
public static final String DB_TABLE_NAME1 = "playertable";
public static final String DB_TABLE_NAME2 = "itemtable";
public static String TAG = "openhelper";
private static final String DB_CREATE_TABLE_PT = "CREATE TABLE IF NOT EXISTS "
        + DB_TABLE_NAME1
        + " ("
        + "ID INT(2) PRIMARY KEY AUTOINCREMENT,"
        + "Name VARCHAR(30) ,"
        + "HP INT(3) ,"
        + "Satisfaction INT(3) ,"
        + "Hygiene INT(1) , " + "IsAlive INT(1) " + " )";

private static final String DB_CREATE_TABLE_IT = "CREATE TABLE IF NOT EXISTS "
        + DB_TABLE_NAME2
        + " ("
        + "Money INT(3) ,"
        + "Gas INT(3) ,"
        + "Food INT(3) ,"
        + "Toiletries INT(3) ,"
        + "Spareparts INT(3) ,"
        + "Meds INT(3) ,"
        + "Tents INT(3) ,"
        + "Ration INT(1) ,"
        + "Trabbihp INT(3) ," + "Trabbispeed INT(2)" + " )";

public DBOpenHelper(Context context, String databaseName) {
    super(context, databaseName, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    Log.d("TAG", "PT :" + DB_CREATE_TABLE_PT);
    db.execSQL(DB_CREATE_TABLE_PT);
    Log.d(TAG, "PT create" + DB_CREATE_TABLE_PT);
    db.execSQL(DB_CREATE_TABLE_IT);
    Log.d(TAG, "IT create" + DB_CREATE_TABLE_IT);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_NAME1);
    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_NAME2);
    onCreate(db);
}

}

DB:

public class DB {

private Context context;
private SQLiteDatabase db;
private static String TAG = "save";
private static ContentValues itemValues = new ContentValues();
private static ContentValues playerValues = new ContentValues();

public DB(Context context) {
    this.context = context;
    DBOpenHelper dbHelper = new DBOpenHelper(this.context, "RTDB");
    this.db = dbHelper.getWritableDatabase();
}

public void savePlayer(Player player[]) {

    for (int i = 0; i <= 3; i++) {

        playerValues.put("Name", player[i].getName());
        playerValues.put("HP", player[i].getHp());
        playerValues.put("Satisfaction", player[i].getsatisfaction());
        playerValues.put("Hygiene", player[i].isHygieneInt());
        playerValues.put("IsAlive", player[i].isAliveInt());

    }
    db.insert("playertable", null, playerValues);
}

// Speichern der Items
// TODO Position fehlt noch
public void saveItems() {
    itemValues.put("Money", Resource.money);
    itemValues.put("Gas", Resource.gas);
    itemValues.put("Food", Resource.food);
    itemValues.put("Toiletries", Resource.toiletries);
    itemValues.put("Spareparts", Resource.spareparts);
    itemValues.put("Meds", Resource.meds);
    itemValues.put("Tents", Resource.tents);
    itemValues.put("Ration", Resource.ration);
    itemValues.put("Trabbihp", Resource.trabbihp);
    itemValues.put("Trabbispeed", Resource.trabbispeed);

    db.insert("itemtable", null, itemValues);
}

// Hier werden die Items aus der Datenbank abgefragt, der zurueckgelieferte
// Cursor vie cursorToIntArray() in einen Int Array umgewandelt und dessen
// Inhalt in die Ressource Klasse geschrieben
public void loadItems() {
    Cursor itemCursor = db.query("itemtable", null, null, null, null, null,
            null);
    int[] itemIntArray = cursorToInt(itemCursor, 9);

    Resource.money = itemIntArray[0];
    Resource.gas = itemIntArray[1];
    Resource.food = itemIntArray[2];
    Resource.toiletries = itemIntArray[3];
    Resource.meds = itemIntArray[4];
    Resource.tents = itemIntArray[5];
    Resource.ration = itemIntArray[6];
    Resource.trabbihp = itemIntArray[7];
    Resource.trabbispeed = itemIntArray[8];
}

// Name und Restliche Int-Werte der Playerobjekte werden separat aus der
// Datenbank geholt und gesetzt
public void loadPlayer() {
    String[] namecolumn = { "Name" };
    String[] intcolumn = { "ID, Name, HP, Satisfaction, Hygiene, IsAlive" };
    String[] namesToString = new String[4];

    Cursor playerCursor = db.query("playertable", intcolumn, null, null,
            null, null, "ID");
    playerCursor.moveToPosition(-1);
    int i = 0;
    while (i <= 3) {
        playerCursor.moveToNext();
        String temp = playerCursor.getString(1);
        Resource.playerArray[i].setName(temp);
        int tempint = playerCursor.getInt(2);
        Resource.playerArray[i].setHp(tempint);
        tempint = playerCursor.getInt(3);
        Resource.playerArray[i].setsatisfaction(tempint);
        tempint = playerCursor.getInt(4);
        Resource.playerArray[i].setHygieneInt(tempint);
        tempint = playerCursor.getInt(5);
        Resource.playerArray[i].setAliveInt(tempint);
        i++;

    }
}

public void dropTables() {
    db.execSQL("DROP TABLE 'playertable';");
    db.execSQL("DROP TABLE 'itemtable';");
}

private int[] cursorToInt(Cursor cursor, int n) {
    int[] results = new int[n];
    for (int i = 0; i <= n - 1; i++) {
        results[i] = cursor.getInt(i + 1);
    }

    return results;
}

private String[] cursorToString(Cursor cursor) {
    String[] results = new String[4];
    int columnIndex = cursor.getColumnIndex("Name");
    for (int i = 0; i <= 3; i++) {
        results[i] = cursor.getString(columnIndex);
    }

    return results;
}

}

Testactivity onCreate экземплярной БД:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.myDB = new DB(this);
    initUI();
    testcase1();

1 Ответ

1 голос
/ 28 сентября 2011

Не уверен, что ваше описание того, как функционирует getWritableDatabase, является правильным: глядя на ваш код, вы, кажется, делаете все правильно, поскольку я использую очень похожую структуру во многих развернутых приложениях без каких-либо ошибок.Он правильно обрабатывает создание / обновление всех таблиц, независимо от того, существуют они или нет, или база данных существует.Возможно, вы захотите сделать DBOpenHelper статическим классом: это работает для меня.В качестве альтернативы внимательно проверьте свои журналы: если есть какое-то другое исключение, которое может показаться не связанным на первый взгляд, это может указать вам на решение.

РЕДАКТИРОВАТЬ: Попробуйте private static class DBOpenHelper extends SQLiteOpenHelper.Я бы также предложил изменить версию базы данных, чтобы вызвать метод onUpgrade.В общем случае, когда вы удалили таблицы, но файл существует, вам потребуется вызвать информационную схему, чтобы проверить, определены ли в файле базы данных таблицы.onCreate вызывается только в том случае, если файл не существует, а onUpdate вызывается только в случае изменения версии базы данных.

РЕДАКТИРОВАТЬ: см. http://www.sqlite.org/faq.html#q7 для получения более подробной информации об использовании информации.таблица схемы, чтобы проверить, существует ли ваша таблица.Вы можете просто выполнить запрос к таблице SQLITE_MASTER, а затем, если не можете найти конкретную таблицу, запустить оператор CREATE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...