2015-12-20 3 views
-1

Я работал с таблицей базы данных, содержащей имя игрока, количество побед и количество потерь.
Тогда я бы назвал базу данных из основного вида деятельности, откройте, обновил или что-то еще, и, наконец, закройте.Невозможно запустить/создать базу данных SQLite в android

И это работало отлично.

Затем я добавил другие столбцы и продолжал работать.
Однако я установил игру на реальное устройство, и это не сработало.
Проблема не была в моем эмуляторе, так как она снова и снова перезаписывала существующую базу данных.
Я решил unistall приложение из эмулятора, а затем перестал работать. Кажется, что моя игра обнаружила некоторые проблемы при создании новой базы данных при первом запуске.

После выполнения некоторых тестов у меня были разные ошибки, такие как «не null constrain» или «CursorIndexOutOfBounds».
Поэтому я могу сказать, что проблема заключается в создании базы данных, но я не знаю, что случилось.
Я не думаю, что ошибка находится в основном Управлении, так как я всегда делал то же самое и раньше работал, но я изменил базу данных.

Возможно, проблема в том, где я инициализирую значения в функции onCreate(), например, это не дает значения для базы данных?

В любом случае, возможно, я сосредоточен на неправильной точке, поэтому я подумал, что новые перспективы могут помочь.

Здесь у вас есть класс базы данных:

public class DatabaseAdapter { 

private final Context context; 

public static final String C_COLUMNA_ID = "_id"; 
public static final String C_COLUMNA_NAME = "menu_player"; 
public static final String C_COLUMNA_VICTORY = "menu_victory"; 
public static final String C_COLUMNA_LOSS = "menu_loss"; 
public static final String C_COLUMNA_POINTS = "menu_points"; 
public static final String C_COLUMNA_UNLOCKED = "menu_unlocked"; 
public static final String C_COLUMNA_LEVEL = "menu_level"; 

private static final String NAME_TABLE = "menu"; 
private static final String DATABASE_NAME = "data"; 
private static final String TAG = "DBAdapter"; 
private String INSERT_OR_UPDATE_RECORD; 

private DatabaseHelper DatabaseHelper; 
private SQLiteDatabase db; 

public DatabaseAdapter(Context context){ 
    this.context = context; 
    DatabaseHelper = new DatabaseHelper(context); 
} 

private static class DatabaseHelper extends SQLiteOpenHelper{ 

    private static final int DATABASE_VERSION = 1; 

    public DatabaseHelper(Context context){ 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database){ 
     database.execSQL("CREATE TABLE MENU(" + 
       " _id INTEGER PRIMARY KEY," + 
       " menu_player TEXT NOT NULL, " + 
       " menu_victory INTEGER, " + 
       " menu_loss INTEGER," + 
       " menu_points INTEGER," + 
       " menu_unlocked INTEGER," + 
       " menu_level INTEGER)"); 

     //initialize 
     database.execSQL("INSERT INTO MENU(_id, menu_player) VALUES(1,'Pla Yer Uan')"); 
     database.execSQL("INSERT INTO MENU(_id, menu_victory) VALUES(1,0)"); 
     database.execSQL("INSERT INTO MENU(_id, menu_loss) VALUES(1,0)"); 
     database.execSQL("INSERT INTO MENU(_id, menu_points) VALUES(1,0)"); 
     database.execSQL("INSERT INTO MENU(_id, menu_unlocked) VALUES(1,0)"); 
     database.execSQL("INSERT INTO MENU(_id, menu_level) VALUES(1,1)"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion){ 
     database.execSQL("DROP TABLE IF EXISTS todo"); 
     onCreate(database); 
    } 

} 

public DatabaseAdapter open() throws SQLException{ 
    db = DatabaseHelper.getWritableDatabase(); 
    return this; 
} 

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

public boolean updateRecord(long rowId, String columna, String newPlayerName, int value){ 
    ContentValues args = new ContentValues(); 
    switch (columna){ 
     case "nombre": 
      args.put(C_COLUMNA_NOMBRE, newPlayerName); 
      break; 
     case "victory": 
      args.put(C_COLUMNA_VICTORY,value); 
      break; 
     case "loss": 
      args.put(C_COLUMNA_LOSS,value); 
      break; 
     case "royals": 
      args.put(C_COLUMNA_POINTS,value); 
      break; 
     case "unlocked": 
      args.put(C_COLUMNA_UNLOCKED,value); 
      break; 
     case "level": 
      args.put(C_COLUMNA_LEVEL,value); 
      break; 
    } 

    return db.update(NAME_TABLE,args,C_COLUMNA_ID + "=" + rowId,null)>0; 
} 

public void backToDefault(){ 
    ContentValues args = new ContentValues(); 
    args.put(C_COLUMNA_NAME, "Pla Yer Uan"); 
    args.put(C_COLUMNA_VICTORIAS,0); 
    args.put(C_COLUMNA_DERROTAS,0); 
    args.put(C_COLUMNA_ROYALS,0); 
    args.put(C_COLUMNA_UNLOCKED,0); 
    args.put(C_COLUMNA_LEVEL,1); 
    db.update(NAME_TABLE,args,C_COLUMNA_ID + "=" + 1,null); 
} 

public Cursor getRecord(long rowId, String columna) throws SQLException{ 
    Cursor cursor = db.query(true, NAME_TABLE, new String[]{ 
      C_COLUMNA_ID, 
      columna 
      }, 
      C_COLUMNA_ID + "=" + rowId, 
      null, 
      null, 
      null, 
      null, 
      null); 
    if (cursor != null){ 
     cursor.moveToFirst(); 
    } 
    return cursor; 
} 

} 

Получение этой ошибки:

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
+0

Вы вводите один и тот же первичный ключ несколько раз в onCreate Method. –

ответ

6

Это

//initialize 
    database.execSQL("INSERT INTO MENU(_id, menu_player) VALUES(1,'Pla Yer Uan')"); 
    database.execSQL("INSERT INTO MENU(_id, menu_victory) VALUES(1,0)"); 
    database.execSQL("INSERT INTO MENU(_id, menu_loss) VALUES(1,0)"); 
    database.execSQL("INSERT INTO MENU(_id, menu_points) VALUES(1,0)"); 
    database.execSQL("INSERT INTO MENU(_id, menu_unlocked) VALUES(1,0)"); 
    database.execSQL("INSERT INTO MENU(_id, menu_level) VALUES(1,1)"); 

действительно неправильно

Вы должны ввести полный ряд сразу, например, так:

//initialize 
    database.execSQL("INSERT INTO MENU(menu_player, menu_victory, menu_loss, menu_points, menu_unlocked, menu_level) VALUES('Pla Yer Uan', 0, 0, 0, 0, 1)"); 

заметить также, что вам не нужно, чтобы вставить _id поля, так что это автоинкремент первичного ключа

+0

Это первый раз, когда я работаю с базой данных, я пытаюсь учиться, делая это тоже ... Я изменил то, что вы прокомментировали, но я все еще получаю сообщение об ошибке. – josepmeg

+0

Я прошу первую строку, которая должна быть там после исправления 'database.execSQL (« INSERT INTO MENU »(menu_player, menu_victory, menu_loss, menu_points, menu_unlocked, menu_level) VALUES (« Pla Yer Uan », 0, 0, 0, 0, 1) "),' right? Также я не задал первичный ключ автоинкремента, я просто работаю с одной строкой нескольких столбцов. – josepmeg

+0

Вы получаете эту ошибку, потому что курсор не возвратил никаких строк.Это означает, что вы передаете не существующий 'rowID' в' public Cursor getRecord (long rowId, String columna) '. Не полагайтесь на то, что столбец '_id' всегда начинается с ** 0 **. Потому что, если вы удалили предыдущие строки, счетчик '_id' ** не обнуляется **. –

0

Если это помогает любому, изменения в базе данных вызвали несовместимости с предыдущей установленной базой данных. Таким образом, переход к эмулятору и удаление приложения и его установка снова (после внесения некоторых изменений) также могут помочь.

Смежные вопросы