SQLiteException: no such table что делать с этим бредом?

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

SQLiteException: no such table что делать с этим бредом?

Сообщение altwin » 24 дек 2013, 17:54

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

Код: Выделить всё

if (database.isOpen()){
            try {
                Cursor cursor = database.query(DbHelper.TABLE_NAME, allColumns,
                        null, null, null, null, DbHelper.COLUMN_ID, null);

                cursor.moveToFirst();
                while(!cursor.isAfterLast()) {
                    Curses curse = cursorToCurse(cursor);
                    curses.put(curse.getLesson_number(), curse.getCurses());
                    cursor.moveToNext();
                }

                cursor.close();
            }catch(Exception e) {
                e.printStackTrace();
                Log.e("LOGTAG", "дебильная ошибка");
            }
коротко суть, по скольку блок if отрабатывает -очевидно, что база открыта как минимум на чтение. Путь к базе дефолтный и она создается(что можно посмотреть в файл эксплорере. DbHelper.TABLE_NAME - именно то имя таблицы к которой идет запрос, проверял - в терминале выполнял SQL запрос, к этой базе(выгруженной с устройства) при выполнение которого idea выкинула трассривку ошибки(запрос простой SELECT _id, ..., и т.д., FROM (DbHelper.TABLE_NAME) ORDER BY _id)...

Проблема в том, что в активити пустое, и информация с базы не попадает... а в терминале именно одна ошибка - SQLiteException: no such table: DbHelper.TABLE_NAME, while compiling: SELECT _id, ..., и т.д., FROM (DbHelper.TABLE_NAME) ORDER BY _id + в логе "дебильная ошибка"(из этого блока).

P.S. наверно нужно добавить, что никакая база в коде вообще не создается, а используется существующая и открывается только на чтение.
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение anber » 24 дек 2013, 18:21

Тестируешь на девайсе? Попробуй полностью удалить приложение с него, сделать rebuild и установить.
UPD. Покажи как открываешь базу данных.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение altwin » 24 дек 2013, 19:27

anber писал(а):Тестируешь на девайсе? Попробуй полностью удалить приложение с него, сделать rebuild и установить.
UPD. Покажи как открываешь базу данных.
открывается база просто, есть класс DbHelper с константами имен полей и т.д. + логика отвечающая за копирование бд. Далее(открывает метод open(), остальное для полноты):

Код: Выделить всё

    private SQLiteDatabase database;
    private DbHelper dbHelper;
    private String[] allColumns = { DbHelper.COLUMN_ID, DbHelper.COLUMN_CURSES, DbHelper.COLUMN_URL,
                                    DbHelper.COLUMN_CURSES_NUMBER};

    public CursesDataSource(Context context) {
        dbHelper = new DbHelper(context);
    }

    public void open() throws SQLException {
        database = dbHelper.getReadableDatabase();
    }
[ИНТЕРЕСНО]возможно я не правильно понял причину ошибки, но раз ее нет нет времени заморачиваться, но в DBHelper я на всякий случай оставил метод open(), сейчас он не используется но базу открывал без ошибок...:

Код: Выделить всё

public void open() {
        // Open the database
        String myPath = DATABASE_PATH + DATABASE_NAME;
        database = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);

    }
далее код, который я показывал выше отвечает за чтение из бд и помещает результат в Map<String, String>, используется метод cursorToCurse(Cursor cursor):

Код: Выделить всё

private Curses cursorToCurse(Cursor cursor) {
        Curses curse = new Curses();
        curse.setId(cursor.getLong(0));
        curse.setCurses(cursor.getString(1));
        curse.setUrl(cursor.getString(2));
        curse.setLesson_number(cursor.getString(3));
        return curse;
    }
который в свою очередь помещает данный из базы в объект класса Curses и далее уже из этих объектов заполняется Map(он мне нужен, поскольку для списка использую кастомный адаптер, кода там не мало, поскольку приходилось сортировать Map объекты, потому переписывать только из за перехода данных в бд не хочу.. мне проще заполнить Map из базы и не трогать существующую логику.)

P.S. собственно забыл написать - уже решено, проблема была в правах, тестировал в Genymotion и на реальном устройстве + емулятор, вероятно запутался когда руками копировал базу, потому SQL выполнялся в терминале, оказалось без прав рута база копировалась не правильно, работало только в эмуляторе, потому поправил копирование - работает. Плюс приходится делать копирование базы отдельным потоком, поскольку если базы нет(первый запуск/очистка устройства) Курсор вылетает и лист вью пустой...приходится возвращаться. Так что вопрос практически решен - проблема была на стадии копирования бд, но вот осталось переписать логику копирования бд в другом потоке и делать запрос только после синхронизации...
Сорри много букв наверно, но бежать надо - зашел перед выходом, решил быстро ответить не думая )))
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение anber » 24 дек 2013, 19:39

altwin писал(а):собственно забыл написать - уже решено
поздравляю
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Foenix » 24 дек 2013, 20:14

причем тут рут и копирование базы? вы же в свою папку ее копируете
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение altwin » 24 дек 2013, 20:20

Foenix писал(а):причем тут рут и копирование базы? вы же в свою папку ее копируете
потому, что база не существует в файловой системе а доступ к ней не указан в манифесте, reasearch я не делал, но предполагаю, что проблема в этом и решил я ее банальным созданием файла базы перед выполнением операции с массивами байт для реализации копирования.

P.S. по сути основная причина этого в том, чтобы сделать файл базы не доступным(по умолчанию создавая его - он доступен всем и не важно чья это папка...) а в данном случае база закрыта стандартными unix правами для пользователей.
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Foenix » 24 дек 2013, 20:58

ох и закрутил, ничего не понятно
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение altwin » 24 дек 2013, 21:14

Foenix писал(а):ох и закрутил, ничего не понятно
ну простите, под конец дня голова не соображает. Просто вся суть в правах которые получаются на файл(если просто скопировать файл он будет доступен всем), плюс я не использую в приложении пермишен WRITE_EXTERNAL_STORAGE.
Изображение

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение ivannatobedev » 11 дек 2014, 17:16

в классе по работе с бд создаются две таблицы со связью:

1-я:

Код: Выделить всё

public void createArtistTable(SQLiteDatabase db){
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_ARTIST +
" (artistid INTEGER PRIMARY KEY, artistname TEXT);");
2-я:

Код: Выделить всё

public void createTrackTable(SQLiteDatabase db){
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_TRACK + 
"(trackid INTEGER, trackname TEXT, trackartist INTEGER, "
+ "FOREIGN KEY(trackartist) REFERENCES artist(artistid));");
создание:

Код: Выделить всё

public void onCreate(SQLiteDatabase db) {
createArtistTable(db);
createTrackTable(db);
Далее есть два метода селекта данных
- для первой таблицы:

Код: Выделить всё

public void refreshDbArtist(SQLiteDatabase db){
		int ipp = 0;
		arrayArtist = new ArrayList<String>();
		arrayArtistID = new ArrayList<String>();
		arrayArtist.clear();
		arrayArtistID.clear();
		Cursor cursor = db.rawQuery("SELECT * FROM "+ TABLE_ARTIST, null);
		while (cursor.moveToNext())
		{
			String name = cursor.getString(cursor.getColumnIndex("artistname"));
			String id = cursor.getString(cursor.getColumnIndex("artistid"));
			ipp++;
			arrayArtist.add(ipp+"."+name);
			arrayArtistID.add(id);
		}
		cursor.close();
		for(int i=0; i<arrayArtistID.size(); i++)
			{
			arrayArtist.get(i);
			arrayArtistID.get(i);
			}
	}
- для второй таблицы:

Код: Выделить всё

	public void refreshDbTrack(SQLiteDatabase db){
		int ipp = 0;
		arrayTrack = new ArrayList<String>();
		arrayTrackID = new ArrayList<String>();
		//arrayTrack.clear();
		//arrayTrackID.clear();
		
		Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRACK, null);
		while (cursor.moveToNext())
		{
			String name = cursor.getString(cursor.getColumnIndex("trackname"));
			String id = cursor.getString(cursor.getColumnIndex("trackartist"));
			ipp++;
			arrayTrack.add(ipp+"."+name);
			arrayTrackID.add(id);
		}
		cursor.close();
		for(int i=0; i<arrayTrackID.size(); i++)
			{
			arrayTrack.get(i);
			arrayTrackID.get(i);
			}
	}
и вызываются в главной активности onCreate

Код: Выделить всё

DBwork db = new DBwork(this);		
		sqdb = db.getWritableDatabase();
		db.refreshDbArtist(sqdb);
		db.refreshDbTrack(sqdb);
так вот метод refreshDbArtist() отрабатывает норм, а метод refreshDbTrack() ломает приложение.
После дебага установил что вылетает в этом месте:

Код: Выделить всё

Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRACK, null);
Пишет в логе "no such table: track".
SQL запросы проверил на синтаксис через менеджер - все ок.
..собсно TABLE_TRACK и TABLE_ARTIST это константы равные track и artist соответственно. Подскажите, в чем ошибка или хотя бы куда копать?Я из числа "зеленых начинающих =)"

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Mikhail_dev » 11 дек 2014, 17:56

(deleted. не увидел инфу про ошибку)
Последний раз редактировалось Mikhail_dev 11 дек 2014, 17:59, всего редактировалось 1 раз.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Foenix » 11 дек 2014, 17:57

раз говорит - нет таблицы, значит ее нет.
а вообще делать запросы через rawQuery конечно можно, но зачем?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Mikhail_dev » 11 дек 2014, 18:00

а вообще делать запросы через rawQuery конечно можно, но зачем?
ну мне например удобней видеть голый запрос, плюс быстрее написать запрос можно.
Да, можно получить инъекцию, но если работать с целочисленными данными, то вполне себе вариант

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Foenix » 11 дек 2014, 18:42

"голые" запросы тоже можно увидеть если надо. Только в таких простейших случаях - зачем?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение ivannatobedev » 12 дек 2014, 10:09

Подскажите хотя бы, в каком направлении искать? Ведь сам sql запрос рабочий..То, что таблица не создается я и сам понял(

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Mikhail_dev » 12 дек 2014, 10:29

В смысле в каком направлении двигаться? Может в направлении исправления ошибки?
Нет таблицы? Создайте её! Я даже не знаю как это объяснить еще проще.

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение ivannatobedev » 12 дек 2014, 10:50

я уточню вопрос..есть ли ошибка в моем коде,а если нет, в чем тогда проблема?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Mikhail_dev » 12 дек 2014, 11:12

Вы лучше покажите голый запрос создания и выборки, а не код, смешанный с Java кодом. Так неудобно читать запросы. К тому же рекомендую рутовать своё устройство (или эмулятор использовать), вытащить базу с телефона (папка data/data) и посмотреть через тулзу, к примеру sqlitestudio что у вас в базе находится

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение ivannatobedev » 12 дек 2014, 11:22

рутовать пока что не хочу...
вот запросы на создание:

Код: Выделить всё

db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_ARTIST +
" (artistid INTEGER PRIMARY KEY, artistname TEXT);");

db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_TRACK + 
"(trackid INTEGER, trackname TEXT, trackartist INTEGER, "
+ "FOREIGN KEY(trackartist) REFERENCES artist(artistid));");
запросы селекта..:

Код: Выделить всё

Cursor cursor = db.rawQuery("SELECT * FROM "+ TABLE_ARTIST, null);

Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRACK, null);
с таблицей TABLE_ARTIST ноль проблем(создается, инсертит и селектит). проблема с талицей TABLE_TRACK. запросы я отдельно проверял в SQLite менеджере - все работало норм и таблицы создавались.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Mikhail_dev » 12 дек 2014, 11:38

Я же написал
Вы лучше покажите голый запрос
имеется ввиду тот запрос, что получается в итоге, а не с различными там константами типа TABLE_ARTIST и прочее.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLiteException: no such table что делать с этим бредом?

Сообщение Foenix » 12 дек 2014, 12:15

запусти все на эмуляторе и посмотри свою базу данных, иначе далеко ты так не уедешь. ЭТо все равно что с завязанными глазами работать.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить