Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Flash_2oo9
3 / 3 / 0
Регистрация: 31.10.2012
Сообщений: 142
#1

SQLite "Error inserting" - Программирование Android

11.08.2014, 18:37. Просмотров 726. Ответов 0
Метки нет (Все метки)

Добрый вечер.
Создаю приложение "Обучалку слов анг-рус", не суть важно) Посоветовали мне тут на форуме закинуть словари, в которых хранятся слова и переводы, в SQLite. Для более легкого доступа. Вообщем написал класс для работы с бд(ниже). Но при попытки вставить данные выдает ошибки (приложение продолжает работать, не вылетает, в логах заметил, так бы и не понял в чем проблема):
Кликните здесь для просмотра всего текста
08-10 19:06:09.917 1124-1124/com.projects.learnwords.app E/Database﹕ Error inserting CORRECT_ENGLISH_WORDS=0 SECOND_WORD=собака CORRECT_RUSSIANS_WORDS=0 FIRST_WORD=dog
android.database.sqlite.SQLiteException: no such table: Бд: , while compiling: INSERT INTO Бд(CORRECT_ENGLISH_WORDS, SECOND_WORD, CORRECT_RUSSIANS_WORDS, FIRST_WORD) VALUES(?, ?, ?, ?);
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426)
at com.projects.learnwords.app.DbControl.insert(DbControl.java:60)
at com.projects.learnwords.app.FileManager.writeToDictionary(FileManager.java:141)
at com.projects.learnwords.app.FileManager.readFile(FileManager.java:122)
at com.projects.learnwords.app.FileManager.access$100(FileManager.java:25)
at com.projects.learnwords.app.FileManager$1.onClick(FileManager.java:59)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:159)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
08-10 19:08:14.511 1124-1124/com.projects.learnwords.app I/Database﹕ sqlite returned: error code = 1, msg = no such table: Бд
08-10 19:08:14.535 1124-1124/com.projects.learnwords.app E/Database﹕ Error inserting CORRECT_ENGLISH_WORDS=0 SECOND_WORD=стрела CORRECT_RUSSIANS_WORDS=0 FIRST_WORD=arrow
android.database.sqlite.SQLiteException: no such table: Бд: , while compiling: INSERT INTO Бд(CORRECT_ENGLISH_WORDS, SECOND_WORD, CORRECT_RUSSIANS_WORDS, FIRST_WORD) VALUES(?, ?, ?, ?);
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426)
at com.projects.learnwords.app.DbControl.insert(DbControl.java:60)
at com.projects.learnwords.app.FileManager.writeToDictionary(FileManager.java:141)
at com.projects.learnwords.app.FileManager.readFile(FileManager.java:122)
at com.projects.learnwords.app.FileManager.access$100(FileManager.java:25)
at com.projects.learnwords.app.FileManager$1.onClick(FileManager.java:59)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:159)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
08-10 19:08:14.539 1124-1124/com.projects.learnwords.app I/Database﹕ sqlite returned: error code = 1, msg = no such table: Бд
08-10 19:08:14.562 1124-1124/com.projects.learnwords.app E/Database﹕ Error inserting CORRECT_ENGLISH_WORDS=0 SECOND_WORD=группа CORRECT_RUSSIANS_WORDS=0 FIRST_WORD=band
android.database.sqlite.SQLiteException: no such table: Бд: , while compiling: INSERT INTO Бд(CORRECT_ENGLISH_WORDS, SECOND_WORD, CORRECT_RUSSIANS_WORDS, FIRST_WORD) VALUES(?, ?, ?, ?);
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426)
at com.projects.learnwords.app.DbControl.insert(DbControl.java:60)
at com.projects.learnwords.app.FileManager.writeToDictionary(FileManager.java:141)
at com.projects.learnwords.app.FileManager.readFile(FileManager.java:122)
at com.projects.learnwords.app.FileManager.access$100(FileManager.java:25)
at com.projects.learnwords.app.FileManager$1.onClick(FileManager.java:59)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:159)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
08-10 19:08:14.566 1124-1124/com.projects.learnwords.app I/Database﹕ sqlite returned: error code = 1, msg = no such table: Бд
08-10 19:08:14.589 1124-1124/com.projects.learnwords.app E/Database﹕ Error inserting CORRECT_ENGLISH_WORDS=0 SECOND_WORD=чистилище CORRECT_RUSSIANS_WORDS=0 FIRST_WORD=purgetory
android.database.sqlite.SQLiteException: no such table: Бд: , while compiling: INSERT INTO Бд(CORRECT_ENGLISH_WORDS, SECOND_WORD, CORRECT_RUSSIANS_WORDS, FIRST_WORD) VALUES(?, ?, ?, ?);
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426)
at com.projects.learnwords.app.DbControl.insert(DbControl.java:60)
at com.projects.learnwords.app.FileManager.writeToDictionary(FileManager.java:141)
at com.projects.learnwords.app.FileManager.readFile(FileManager.java:122)
at com.projects.learnwords.app.FileManager.access$100(FileManager.java:25)
at com.projects.learnwords.app.FileManager$1.onClick(FileManager.java:59)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:159)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Приложение пытается 4 раза воспользоваться методом insert(), соответственно 4 ошибки.

Вот код класса для работы с БД:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class DbControl {
    private static final String DB_NAME = "LearnWordsDB.db";
    private final String TABLE_NAME;
    private final int DB_VERSION;
 
    static final String FIRST_WORD = "FIRST_WORD";
    static final String SECOND_WORD = "SECOND_WORD";
    static final String CORRECT_FIRST_WORDS = "CORRECT_ENGLISH_WORDS";
    static final String CORRECT_SECOND_WORDS = "CORRECT_RUSSIANS_WORDS";
 
    private Cursor cursor;
    private SQLiteDatabase database;
    private DbOpenHelper dbOpenHelper;
    private Context context;
 
    public DbControl(Context context, final String TABLE_NAME, int DB_VERSION){
        super();
        this.context = context;
        this.TABLE_NAME = TABLE_NAME;
        this.DB_VERSION =DB_VERSION;
    }
 
    public void open() throws SQLException {
        dbOpenHelper = new DbOpenHelper(context, DB_NAME, null, DB_VERSION);
        database = dbOpenHelper.getWritableDatabase();
    }
 
    public void close(){
        dbOpenHelper.close();
    }
    ///---> нас интересует данный метод
    public void insert(final String FIRST_WORD, final String SECOND_WORD,
                       final int CORRECT_FIRST_WORDS, final int CORRECT_SECOND_WORDS) {
 
        ContentValues values = new ContentValues();
 
        values.put(Dictionary.FIRST_WORD, FIRST_WORD);
        values.put(Dictionary.SECOND_WORD, SECOND_WORD);
        values.put(Dictionary.CORRECT_FIRST_WORDS, CORRECT_FIRST_WORDS);
        values.put(Dictionary.CORRECT_SECOND_WORDS, CORRECT_SECOND_WORDS);
 
        database.insert(TABLE_NAME, null, values);
    }
 
    
    private class DbOpenHelper extends SQLiteOpenHelper{
 
        public DbOpenHelper(Context context, final String DB_NAME, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, DB_NAME, factory, version);
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
            final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + FIRST_WORD + " TEXT, " +
                    SECOND_WORD + " TEXT, " + CORRECT_FIRST_WORDS + " INTEGER, " + CORRECT_SECOND_WORDS + " INTEGER); " ;
            db.execSQL(CREATE_TABLE);
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
            db.execSQL(DROP_TABLE);
            onCreate(db);
        }
    }
}
Код откуда я пытаюсь вставить данные в БД.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
...
private void writeToDictionary(String contents, String dictName){
 
 
        DbControl dict = new DbControl(getApplicationContext(), dictName, 1);
        DictionaryRow[] dictRows = parseWords(contents);
        try {
            dict.open();
            rememberDictionaryName(dictName);
            for(DictionaryRow dr: dictRows) {
                [B]dict.insert(dr.getFirstWord(), dr.getSecondWord(), dr.getCorrectFirstWords(), dr.getCorrectSecondWords());[/B]
            }
        } catch (SQLException e)
        {
            Log.e("CREATE_OR_OPEN_ERROR", e.toString());
            Toast.makeText(getApplicationContext(), "Ошибка", Toast.LENGTH_LONG).show();
        }
    }
    //--->все методы ниже нас не интересуют, они просто разбивают строку String на слова
    private DictionaryRow[] parseWords(String str){
        String firstWord;
        String secondWord;
        String[] strLines = str.split("\n");
        DictionaryRow[] dictRows = new DictionaryRow[strLines.length];
 
        for(int i = 0; i<strLines.length; i++) {
 
            if (!strLines[i].contains("|"))
                return null;
            int separator = strLines[i].indexOf("|");
 
            firstWord = strLines[i].substring(0, separator).toLowerCase();
            secondWord = strLines[i].substring(separator + 1).toLowerCase();
 
            firstWord = checkWord(firstWord);
            secondWord = checkWord(secondWord);
            dictRows[i] = new DictionaryRow(0, firstWord, secondWord, 0, 0);
        }
 
        return dictRows;
    }
 
    public static String checkWord(String word){
        if(word.endsWith(" ") || word.endsWith("\r")) {
            word = word.substring(0, word.length() - 1);
            word = checkWord(word);
        }
 
        if(word.startsWith(" "))
        {
            word = word.substring(1, word.length());
            word = checkWord(word);
        }
        return word;
    }
Так вот, по идеи при вызове
Java
1
database = dbOpenHelper.getWritableDatabase();
должен вызывать метод onCreate(SQLiteDatabase db), в котором должна создавать таблица. Но почему-то пишет, что таблицу не найдено. Как это можно исправить?






Добавлено через 22 часа 9 минут
Решение нашел:
Вообщем все работает, если явно вызвать метод onCreate(SQLiteDatabase db), непонятно только одно, почему везде пишут что данный метод должен сам вызывается при вызове getWritableDatabase(), если на практике это не так!?
Тестировал на телефоне API level 10, может в более новых версиях работает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2014, 18:37     SQLite "Error inserting"
Посмотрите здесь:

Двухуровневый список выбора (Spinner) "Страна->Город" c применением SQLite - Программирование Android
Подскажите пожалуйста в каком виде создавать данные в БД и как правильно переработать файлы чтоб выводить список стран и городов черпая...

"Синхронизация" баз SQLite двух устройств - Программирование Android
Добрый вечер, у меня такой вопрос к знатокам: возможно ли реализовать &quot;синхронизацию&quot; между двумя устройствами, имеющих отличные друг от...

SQLite, отношение "один ко многим" - Программирование Android
Добрый день! Имеется такая задача: Создаю в SQLite две таблицы - &quot;Кинотеатры&quot;, &quot;Фильмы&quot;. У фильма есть параметр - в каких...

Авторизация на сайте: "java.lang.Exception: http error : 401" - Программирование Android
Добрый день. Подскажите пожалуйста, что не так делаю. Отправляю запрос на авторизацию к серверу, а он мне в ответ 401 код ошибки (error =...

Ошибка "Error opening trace file: No such file or directory (2)" - Программирование Android
пару часов назад прога работала включил комп перестала пишет такую ошибку java.lang.RuntimeException: Unable to start activity...

Ссылки (<a href="LINK">XXX</a>) внутри ListView - Программирование Android
Есть контент который я выкачиваю из интернета, и отображаю в листе. Контент располагается в объекте Spanned. В контенте могут быть ссылки,...

Ошибка "Description Resource Path Location Type" - Программирование Android
На еклипсе выдает такую ошибку Description Resource Path Location Type The container 'Android Dependencies' references non existing...

Как "слушать и читать" SMS c определенного номера? - Программирование Android
нужно чтоб приложение прослушивало входящие SMS с определенного(заданного) номера и получало его текст вида(напр): 34,5565 |...

Кнопка "Стереть данные", как от нее защититься? - Программирование Android
В настройках приложения есть кнопка &quot;Стереть данные&quot;, она удаляет все данные (в том числе и sql) приложения. 1 Есть ли способ...

TextInputLayout "открытие поля при старте программы" - Программирование Android
Ребят, всем привет! Вот решил немного изучить дизайн, и не могу понять в чем дело, когда использую TextInputLayout в своем view и стартую -...

Кириллица отображается в виде знаков "закорючек в ромбе" - Программирование Android
Если конкретно то вопрос в ромбе. Только кириллица , латиница отображается норм , я понимаю кодировки , но искал пол дня по всему инету -...

Как отловить причину "unfortunately, application has stopped" на эмуляторе? - Программирование Android
Приветствую всех! Помогите разобраться. Пытаюсь убрать заголовок protected void onCreate(Bundle savedInstanceState) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru