Задать вопрос
kraso4niy
@kraso4niy
fullstack

Как исправить ошибку android no such table ?

Перерыл stackoverflow и везде у всех все просто. Меняем DB_VERSION проверяем в методе onUpgrade , удаляем таблицу и создаем заново (или просто добавляем новые поля).
Я пробовал удалять приложение, чистить данные (clear data в apps manager) , удалял базу из /data/data/myapp/databases/ , пробовал переименовывать базу (test,test.db,new.db,new и т.п) .

База создается, все окей, все таблицы создаются (обновляются), но когда вставляю данные db.insert(TABLE_NAME,null,contentvalues) , то получаю ошибку no such table таблицы которой не должно быть в базе. (В старой схеме присутствовала таблица users)
У меня такое ощущение что есть какой то кеш, который хранит значения переменных и он строго сохранил название таблицы. Ниже пример кода.
Код менеджера базы:
class Database extends SQLiteOpenHelper {

	private static final String TAG = "Database";

	private static final int DB_VERSION = 1;
  	private static final String DB_NAME = "notedb";

  	public static final String TABLE_NAME = "notes";
  	public static final String NOTE_FIELD = "note";
  	
	public Database(Context context) 
	{
		super(context, DB_NAME, null,DB_VERSION);
	}

	/** it's hooks invoke when getWritableDatabase called **/
	@Override
	public void onCreate(SQLiteDatabase db) 
	{
		
		db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + 
				  " ( _id integer primary key autoincrement, "
      			  + NOTE_FIELD + " TEXT)");
		Log.i(TAG,"Database create " + DB_NAME);
	}

	@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       if(oldVersion < DB_VERSION)
       {
		// Logs that the database is being upgraded
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
               + newVersion + ", which will destroy all old data");

        // Kills the table and existing data
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME );
        db.execSQL("DROP TABLE IF EXISTS users");
        // Recreates the database with a new version
        onCreate(db);       	
       }
       
   }
}


Код обработчика:
/* Java - событие на onClick */
Database databaseInstance = new Database(MainActivity.this);
SQLiteDatabase db = databaseInstance.getWritableDatabase();
ContentValues valuesStorage = new ContentValues();
/* prepare */
valuesStorage.put(databaseInstance.NOTE_FIELD,resultsTmp );
db.insert(databaseInstance.TABLE_NAME,null,valuesStorage);
db.close();


Как избавиться от этой ошибки?
ENV: проверяю на эмуляторе через android avd , с эмулятором работаю через шелл adb. Есть девайс нексус 7 2013 и телефон сони, на них тоже самое. Билд проекта идет через ant debug, adb install -r bin/mysppname-debug.apk. ОС Ubuntu 12.04
  • Вопрос задан
  • 5024 просмотра
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
kraso4niy
@kraso4niy Автор вопроса
fullstack
Решение: ant clear в терминале
В итоге команды сборки выглядят так:
ant clear
ant debug
adb install -r bin/yourapp-debug.apk
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@tagantroy
Бегло пробежался по коду,вроде всё правильно. На эмуляторе проверяешь? Создай полностью новый образ(если используешь genymotion) и проверь там.
P.S работать с БД в методе onClick такая себе практика,сделай DAO,в который вынеси весь функционал работы с бд. Я недавно писал приложение заметок, и параллельно получал первый опыт работы с SQLite. загляни на гитхаб, может полезно будет https://github.com/tagantroy/Notes/tree/master/app...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы