В SQLite Android обнаружена ошибка «Нет такой таблицы» - PullRequest
12 голосов
/ 02 июля 2011

Я пытаюсь узнать о базах данных SQLite, но я действительно ненавижу иметь дело с любыми серверными вещами, со страстью. Я уже бьюсь о стены с, казалось бы, простой проблемой.

Вот код, который, я думаю, имеет значение из DatabaseHelper класса

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "Library";

    public static final String TABLE_NAME = "books";
    public static final String TITLE = "title";
    public static final String AUTHOR = "author";
    public static final String ISBN = "isbn";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, isbn TEXT)");
    }


    public boolean insertBook(String title, String author, String isdn) {

        try {
            SQLiteDatabase db = getWritableDatabase();

            ContentValues cv = new ContentValues();
            cv.put(TITLE, title);
            cv.put(AUTHOR, author);
            cv.put(ISBN, isdn);

            db.insert(TABLE_NAME, null, cv);
            db.close();

            return true;
        } catch (Exception exp) {
            exp.printStackTrace();

            return false;
        }
    }
}

А это код в моей основной деятельности

dbHelper = new DatabaseHelper(this);

dbHelper.insertBook("Harry Potter", "JK", "1000");
dbHelper.insertBook("Hamlet", "Shakespeare", "500");

Eclipse сообщает мне, что в методе insertBook() есть ошибка. Там написано, что есть no such table books: .... Я понятия не имею, что я делаю не так здесь. Что делает его более расстраивающим, так это то, что всего за пару минут до того, как он заработал идеально, тогда (я думаю) я отбросил таблицу, и она просто создала ее снова по какой-либо причине, даже если этот код не изменился с тех пор, как я впервые его создал ( Я думаю ...).

Ответы [ 8 ]

39 голосов
/ 02 июля 2011

На вашем устройстве установлена ​​более старая версия базы данных, в которой есть (пустая) база данных, но нет таблицы книг. Если это вариант для вас, просто удалите и переустановите приложение.

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

5 голосов
/ 02 июля 2011

Я написал ORM-фреймворк для этого. https://github.com/ahmetalpbalkan/orman

Вы можете легко писать приложения для Android, используя SQLite. Он использует ваши классы Java (в данном случае Book) в качестве таблиц базы данных (сущностей).

Он даже автоматически создает вашу таблицу, и вы просто говорите book1.insert(), готово.

2 голосов
/ 30 июля 2011

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

1 голос
/ 16 марта 2016

попробуйте это например для вставки:

 public boolean insertBook(String title, String author, String isdn) {

        try {
            SQLiteDatabase db = getWritableDatabase();

            ContentValues cv = new ContentValues();
            cv.put(TITLE, title);
            cv.put(AUTHOR, author);
            cv.put(ISBN, isdn);

            ***try
             {
            db.insert(TABLE_NAME, null, cv);
}
 catch ( SQLiteException e)
        {
            onCreate(db);
  db.insert(TABLE_NAME, null, cv);
}***

            db.close();

            return true;
        } catch (Exception exp) {
            exp.printStackTrace();

            return false;
        }
    }
0 голосов
/ 05 июня 2018

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

0 голосов
/ 11 июня 2017

У меня была эта проблема, но очистка проекта не устранила ее.
Оказалось, я пропустил DATABASE_NAME вместо TABLE_NAME.

0 голосов
/ 28 сентября 2015
db.execSQL(
    "CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, isbn TEXT)"
);

удалить пробел после имени таблицы, должно быть так.

db.execSQL(
    "CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, isbn TEXT)"
);
0 голосов
/ 02 июля 2011

Если по какой-то причине вы удалили таблицу, вы можете удалить базу данных, чтобы приложение правильно ее воссоздало. Используйте adb shell и найдите базу данных в /data/data/[package_name]/databases/. Вы можете просто удалить файл.

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