Правилна работа с базата данни в Android
Има три начина за работа с данни в база данни, които веднага идват на ум: 1) Създавате празна структура на база данни. Потребителят работи с приложението (създава бележки, изтрива ги) и базата данни се попълва. Пример е приложението NotePad в демонстрациите на developer.android.com или на вашето устройство с Android. 2) Вече имате готова база данни, пълна с данни, които трябва да бъдат разпространени с приложението, или анализирайте данни от файл в активи. 3) Получавайте данни от мрежата според нуждите. Ако има един или два други начина, с радост ще добавя към този списък с ваша помощ. Всички основни уроци са предназначени само за първия случай. Пишете заявка за създаване на структура на база данни и изпълнявате тази заявка в метода onCreate() на класа SQLiteOpenHelper, като този:
така. По-пълна версия на класа и други компоненти можете да видите на връзката в долната част на статията. Освен това можете да замените методите onOpen(), getReadableDatabase()/getWritableDatabase(), но обикновено горните методи и методите за извличане на данни са достатъчни. След това създаваме екземпляр на този клас в нашето приложение, когато то стартира и изпълнява заявки, тоест проблемната част е предадена. Защо е проблемна? Защото, когато потребителят изтегля приложения от пазара, той не мисли за вашата база данни и всичко може да се случи. Да приемем, че мрежата не работи, или друг процес работи, или сте написали податлив на грешки код.
Между другото, има още нещо, на което си струва да обърнете внимание. Променлива на екземпляр на нашия клас може да бъде създадена и съхранена в обекта Application и достъпна при необходимост, но трябва да помним да извикаме метода close(), тъй като постоянната връзка с базата данни е тежък ресурс. Освен това може да има сблъсъци при работа с базата данни.от множество нишки. Но има друг начин, например, да създадем нашия обект според нуждите за достъп до базата данни. Мисля, че това е въпрос на предпочитание, но също трябва да се обсъди.
А сега най-важното. Ами ако трябва да използваме вече съществуваща база данни с данни в приложението? С малко гугъл веднага ще попаднете на тази „страхотна статия“ – www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications, която изглежда има подходящата панацея. Но го нямаше. Освен това има няколко грешки.
Може би изходът от това ще бъде следното решение (разглежда се вариант № 2). Използвайки първата опция за работа с базата данни, попълнете я с данни след създаването, например:
Като цяло, тази публикация показва (по отношение на метод номер 2) как да не го правите, но също така съдържа няколко интересни мисли. Методът getReadableDatabase() може да бъде заменен по следния начин:
Между другото: следвайки практиката на самата платформа, полето за първичен ключ трябва да се нарича "_id".
UPDТоку-що тествах вашия подход. Всичко работи в емулатора, но бъдете внимателни.
Файлът data.txt е в активи като този: Zametka #1 Zametka #2 Zametka #3 Zametka #4
И класът на приложението:
Имайте предвид, че този клас се използва само за демонстриране и тестване на това, което се случва, когато се извикат методите getReadableDatabase()/getWritableDatabase() и се създаде базата данни. В реални проекти кодът трябва да се адаптира. В допълнение, етикетът android_metadata се появи в базата данни (без мое участие), така че горната грешка е разрешена. Надявам се да е полезно на някого.
Любопитни допълнения №1(от Хабраузер Калобок)
Засега напълно съм изоставил SQLiteOpenHelper - оказа се, че в него е невъзможно да се създаде база данни на SD карта.На теория това, което връща, трябва да се използва като път към базата. На практика SQLiteOpenHelper понякога го използва, а понякога го заобикаля - зависи дали отваряме базата данни за четене или запис, дали вече съществува и т.н. SQLiteOpenHelper.getWritableDatabase извиква Context.openOrCreateDatabase, който от своя страна използва Context.validateFilePath, за да получи пълния път до файла. Той използва частния метод Context.getDatabasesDir, който не може да бъде заменен - ето ни. Базата данни ще бъде създадена в стандартната директория.
Но ако извикаме SQLiteOpenHelper.getReadableDatabase, първо ще се опита да извика същата getWritableDatabase. Но ако това не се получи, тогава ще заобиколи Context.openOrCreateDatabase - ще извика самия Context.getDatabasePath (можем да го поправим) и ще отвори сама необходимата база данни. Този метод би ни подхождал, ако винаги се използва. Но уви. :( Като цяло идеята с този помощник беше добра, а изпълнението беше ляво от махмурлук.
Hardcore conf в C++. Каним само професионалисти.