Страница 1 из 2

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

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

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

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. наверно нужно добавить, что никакая база в коде вообще не создается, а используется существующая и открывается только на чтение.

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

Добавлено: 24 дек 2013, 18:21
anber
Тестируешь на девайсе? Попробуй полностью удалить приложение с него, сделать rebuild и установить.
UPD. Покажи как открываешь базу данных.

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

Добавлено: 24 дек 2013, 19:27
altwin
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 выполнялся в терминале, оказалось без прав рута база копировалась не правильно, работало только в эмуляторе, потому поправил копирование - работает. Плюс приходится делать копирование базы отдельным потоком, поскольку если базы нет(первый запуск/очистка устройства) Курсор вылетает и лист вью пустой...приходится возвращаться. Так что вопрос практически решен - проблема была на стадии копирования бд, но вот осталось переписать логику копирования бд в другом потоке и делать запрос только после синхронизации...
Сорри много букв наверно, но бежать надо - зашел перед выходом, решил быстро ответить не думая )))

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

Добавлено: 24 дек 2013, 19:39
anber
altwin писал(а):собственно забыл написать - уже решено
поздравляю

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

Добавлено: 24 дек 2013, 20:14
Foenix
причем тут рут и копирование базы? вы же в свою папку ее копируете

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

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

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

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

Добавлено: 24 дек 2013, 20:58
Foenix
ох и закрутил, ничего не понятно

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

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

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

Добавлено: 11 дек 2014, 17:16
ivannatobedev
в классе по работе с бд создаются две таблицы со связью:

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 соответственно. Подскажите, в чем ошибка или хотя бы куда копать?Я из числа "зеленых начинающих =)"

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

Добавлено: 11 дек 2014, 17:56
Mikhail_dev
(deleted. не увидел инфу про ошибку)

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

Добавлено: 11 дек 2014, 17:57
Foenix
раз говорит - нет таблицы, значит ее нет.
а вообще делать запросы через rawQuery конечно можно, но зачем?

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

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

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

Добавлено: 11 дек 2014, 18:42
Foenix
"голые" запросы тоже можно увидеть если надо. Только в таких простейших случаях - зачем?

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

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

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

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

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

Добавлено: 12 дек 2014, 10:50
ivannatobedev
я уточню вопрос..есть ли ошибка в моем коде,а если нет, в чем тогда проблема?

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

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

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

Добавлено: 12 дек 2014, 11:22
ivannatobedev
рутовать пока что не хочу...
вот запросы на создание:

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

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 менеджере - все работало норм и таблицы создавались.

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

Добавлено: 12 дек 2014, 11:38
Mikhail_dev
Я же написал
Вы лучше покажите голый запрос
имеется ввиду тот запрос, что получается в итоге, а не с различными там константами типа TABLE_ARTIST и прочее.

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

Добавлено: 12 дек 2014, 12:15
Foenix
запусти все на эмуляторе и посмотри свою базу данных, иначе далеко ты так не уедешь. ЭТо все равно что с завязанными глазами работать.