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

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

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

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

11.08.2014, 18:37. Просмотров 761. Ответов 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" (Программирование Android):

SQLite, ошибка: не существует поля "почта" в базе данных - Программирование Android
Создал самую простую программку для понимания баз данных SQLite. Есть два поля: имя и почта. 3 кнопки: добавить в базу данных, считать с...

"Attempt to re-open an already-closed object" при работе с SQLite - Программирование Android
Добрый день. Разрабатываю приложение и столкнулся с проблемой... Лог выдаёт вот такое: FATAL EXCEPTION: main ...

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

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

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

"Error while reading RSS" при попытке загрузить новости - Программирование Android
Здравствуйте! При попытке загрузить новости приложение выдает ошибку error while reading RSS. Что это значит? Где исправить в коде?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2014, 18:37
Привет! Вот еще темы с ответами:

При компиляции вылазит ошибка Installation error: "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE" - Программирование Android
Здравствуйте, пытаюсь скомпилировать приложение на библиотеке LibGdx использую Genymotion и при компиляции вылазит ошибка(Вот лог): The...

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

Работа с БД, связывание таблиц "фильмы", "жанры", "режиссеры" - Программирование Android
Ребят, всем привет! накидайте какие-нить идеи по реализации ситуация такая есть таблицы - &quot;списки_жанров&quot;, &quot;фильмы&quot;, &quot;режиссеры&quot; мне...

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log" - Программирование Android
Unknown method 'e' of 'org.apache.commons.logging.Log' package com.mycompany.myapp; import android.widget.*; import...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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