Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 14 дек 2018, 20:45

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: SQLite на SD карте
СообщениеДобавлено: 31 янв 2012, 17:01 

Зарегистрирован: 09 янв 2012, 01:31
Сообщений: 11
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Как-то мне понадобилось создать в приложении базу данных и сохранить её на карте памяти. Использовать для этого SQLiteOpenHelper не получилось, потому что он создаёт базу не на карте, а в телефоне, и скопировать её потом без root проблематично. damager82 помог разобраться с SQLiteDatabase.openOrCreateDatabase(), огромное ему спасибо. Я написал класс - MyDataBaseOpenHelper, выкладываю может кому пригодится.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. import java.io.File;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.os.Environment;
  5.  
  6. public abstract class MyDataBaseOpenHelper {
  7.         private SQLiteDatabase db;
  8.         private SQLiteDatabase readDb;
  9.         private SQLiteDatabase writeDb;
  10.         private File dbFile;
  11.         private String dbName;
  12.         private boolean isExistDB;
  13.         public MyDataBaseOpenHelper(Context context, String dbName) {
  14.                 super();
  15.                 this.isExistDB = false;
  16.                 this.dbName = dbName;
  17.                 this.prepareBD();
  18.                 if(!isExistDB){
  19.                         onCreate(db);
  20.                 }
  21.                 this.setReadDb();
  22.                 this.setWriteDb();
  23.         }
  24.  
  25.         private void prepareBD() {
  26.                 try{
  27.                     File sdCard = Environment.getExternalStorageDirectory();
  28.                     File directory = new File(sdCard.getAbsolutePath () + "/" + dbName);
  29.                     directory.mkdirs();
  30.                     dbFile = new File(directory, dbName);
  31.                     if(dbFile.exists())isExistDB=true;
  32.                     this.db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
  33.                 }catch (Exception e) {
  34.                         this.db = SQLiteDatabase.openOrCreateDatabase(dbName, null);
  35.                 }
  36.         }
  37.  
  38.         abstract public void onCreate(SQLiteDatabase db);
  39.  
  40.         abstract public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
  41.  
  42.         public void close(){
  43.                 db.close();
  44.                 writeDb.close();
  45.                 readDb.close();
  46.         }
  47.  
  48.         public SQLiteDatabase openMyDb() {
  49.                 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
  50.                 return db;
  51.         }
  52.  
  53.         public SQLiteDatabase getReadableDatabase(){
  54.                 return this.readDb;
  55.         }
  56.  
  57.         private void setReadDb(){
  58.         SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);
  59.                 this.readDb = resdDb;
  60.         }
  61.  
  62.         public SQLiteDatabase getWritableDatabase(){
  63.                 return this.writeDb;
  64.         }
  65.  
  66.         private void setWriteDb(){
  67.         SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);
  68.             this.writeDb = resdDb;
  69.         }
  70. }
  71.  


Вопрос у меня вот какой! За объектом SQLiteOpenHelper следит активность в которой он создан вметоде onCreate(), и переопределять onDestroy() не нужно, наверно для этого и передаётся в конструкторе SQLiteOpenHelper Context. Объект моего класса обязательно надо закрыть явно в onDestroy() Activity. Какой метод в Context отвечает за закрытие открытых баз данных. Извините если что-то не так. Я не профессионал.


Последний раз редактировалось tyapavel 01 фев 2012, 20:36, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 01 фев 2012, 16:35 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
tyapavel писал(а):
За объектом SQLiteOpenHelper следит активность в которой он создан в методе onCreate()


Я не встречал у Activity возможности следить за SQLiteOpenHelper. Вы уверены?
Activity умеет управлять объектом Cursor, если вызвать метод startManagingCursor.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 01 фев 2012, 20:42 

Зарегистрирован: 09 янв 2012, 01:31
Сообщений: 11
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Сделал два простеньких тестовых приложени. Одно с родным SQLiteOpenHelper другое с моим MyDataBaseOpenHelper
1.)
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. import android.app.Activity;
  2. import android.content.ContentValues;
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6. import android.os.Bundle;
  7.  
  8.  
  9. public class MainActivity extends Activity {
  10.         DbHelper dbHelper;
  11.     @Override
  12.     public void onCreate(Bundle savedInstanceState) {
  13.         super.onCreate(savedInstanceState);
  14.         setContentView(R.layout.main);
  15.         dbHelper = new DbHelper(this, "Test");
  16.     }
  17.    
  18.     class DbHelper extends SQLiteOpenHelper{
  19.  
  20.                 public DbHelper(Context context, String name) {
  21.                         super(context, name, null, 1);
  22.                 }
  23.  
  24.                 @Override
  25.                 public void onCreate(SQLiteDatabase db) {
  26.                         db.execSQL("create table TestDataDase(_id integer primary key autoincrement, firstname text, lastname text)");
  27.                         ContentValues cv = new ContentValues();
  28.                         cv.put("firstname", "Fyodor");
  29.                         cv.put("lastname","Lastochkin");
  30.                         db.insert("TestDataDase", null, cv);
  31.                 }
  32.  
  33.                 @Override
  34.                 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  35.                         db.execSQL("DROP TABLE IF EXISTS TestDataDase");
  36.                         onCreate(db);
  37.                 }
  38.        
  39.     }
  40. }
  41.  

2.)
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. import android.app.Activity;
  2. import android.content.ContentValues;
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.os.Bundle;
  6.  
  7.  
  8. public class MainActivity extends Activity {
  9.         DbHelper dbHelper;
  10.     @Override
  11.     public void onCreate(Bundle savedInstanceState) {
  12.         super.onCreate(savedInstanceState);
  13.         setContentView(R.layout.main);
  14.         dbHelper = new DbHelper(this, "Test");
  15.     }
  16.    
  17.     class DbHelper extends MyDataBaseOpenHelper{
  18.  
  19.                 public DbHelper(Context context, String name) {
  20.                         super(context, name);
  21.                 }
  22.  
  23.                 @Override
  24.                 public void onCreate(SQLiteDatabase db) {
  25.                         db.execSQL("create table TestDataDase(_id integer primary key autoincrement, firstname text, lastname text)");
  26.                         ContentValues cv = new ContentValues();
  27.                         cv.put("firstname", "Fyodor");
  28.                         cv.put("lastname","Lastochkin");
  29.                         db.insert("TestDataDase", null, cv);
  30.                 }
  31.  
  32.                 @Override
  33.                 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  34.                         db.execSQL("DROP TABLE IF EXISTS TestDataDase");
  35.                         onCreate(db);
  36.                 }
  37.        
  38.     }
  39. }
  40.  


В первомслучае программа закрывается нормально, а во втором LogCat выводит

02-01 17:21:10.564: E/Database(282): close() was never explicitly called on database '/mnt/sdcard/Test/Test'
02-01 17:16:27.914: E/Database(282): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

А если во втором случае переопределить onDestroy() и вызвать dbHelper.close(), то всё нормально! :?:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 02 фев 2012, 00:59 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Все верно.

В первом случае подключение не открывается.

А во втором вы в конструкторе суперкласса открываете подключения и их надо закрывать перед выходом из приложения.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 02 фев 2012, 14:30 

Зарегистрирован: 09 янв 2012, 01:31
Сообщений: 11
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Понятно. Изменил суперкласс. Теперь Actyvity.onDestroy() можно не переопределять.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. import java.io.File;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.os.Environment;
  5.  
  6. public abstract class MyDataBaseOpenHelper {
  7.  
  8.         private SQLiteDatabase db;
  9.         private File dbFile;
  10.         private String dbName;
  11.         private boolean isExistDB;
  12.  
  13.         public MyDataBaseOpenHelper(Context context, String dbName) {
  14.             super();
  15.             this.isExistDB = false;
  16.             this.dbName = dbName;
  17.             this.prepareBD();
  18.             if(!this.isExistDB){
  19.                     onCreate(db);
  20.             }
  21.             db.close();
  22.         }
  23.        
  24.         private void prepareBD() {
  25.             try{
  26.                 File sdCard = Environment.getExternalStorageDirectory();
  27.                 File directory = new File(sdCard.getAbsolutePath () + "/" + dbName);
  28.                 directory.mkdirs();
  29.                 dbFile = new File(directory, dbName);
  30.                 if(dbFile.exists())this.isExistDB=true;
  31.                 this.db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
  32.             }catch (Exception e) {}
  33.         }
  34.  
  35.         abstract public void onCreate(SQLiteDatabase db);
  36.        
  37.         abstract public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
  38.  
  39.         public void close(){
  40.                 db.close();
  41.         }
  42.        
  43.         public SQLiteDatabase getReadableDatabase(){
  44.                 SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);
  45.             return resdDb;
  46.         }
  47.  
  48.         public SQLiteDatabase getWritableDatabase(){
  49.                 SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);
  50.                 return resdDb;
  51.         }
  52. }
  53.  


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 24 апр 2012, 08:43 

Зарегистрирован: 30 мар 2012, 09:54
Сообщений: 13
Откуда: Россия, респ. Мордовия, пгт. Торбеево
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
tyapavel, спасибо, очень пригодилось!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 10 мар 2013, 13:49 

Зарегистрирован: 23 сен 2012, 23:10
Сообщений: 33
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
У меня есть одна проблема. Есть класс ExternalDbOpenHelper, который открывает мою базу с флешки, а если ее нет, то копирует ее из assets в папку на флешке. В нем база открывается в режиме readwrite. Так вот, при сохранении записей в БД, они есть и я спокойно отображаю нужное значение в spinner-е, но после пересоздания активити они все пропадают.

Вот класс:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. ;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. import android.content.Context;
  10. import android.database.SQLException;
  11. import android.database.sqlite.SQLiteDatabase;
  12. import android.database.sqlite.SQLiteOpenHelper;
  13. import android.os.Environment;
  14. import android.util.Log;
  15.  
  16. public class ExternalDbOpenHelper extends SQLiteOpenHelper {
  17.  
  18.         //Путь к папке с базами на устройстве
  19.         public static String DB_PATH;
  20.         //Имя файла с базой
  21.         public static String DB_NAME;
  22.         public SQLiteDatabase database;
  23.         public final Context context;
  24.        
  25.         final String DIR_SD = "Hudeem";
  26.         final String dbname = "data.db";
  27.  
  28.         public SQLiteDatabase getDb() {
  29.                 return database;
  30.         }
  31.  
  32.         public ExternalDbOpenHelper(Context context, String databaseName) {
  33.                 super(context, databaseName, null, 1);
  34.                 this.context = context;
  35.                 //Составим полный путь к базам для вашего приложения
  36.                 File sdPath = Environment.getExternalStorageDirectory();
  37.                 DB_NAME = databaseName;
  38.                 DB_PATH = String.format(sdPath.getAbsolutePath() + "/" + DIR_SD + "/", DB_NAME);
  39.                 try {
  40.                         copyDataBase();
  41.                 } catch (IOException e) {
  42.                         // TODO Auto-generated catch block
  43.                         e.printStackTrace();
  44.                 }
  45.                 openDataBase();
  46.         }
  47.  
  48.         //Создаст базу, если она не создана
  49.         public void createDataBase() {
  50.                 boolean dbExist = checkDataBase();
  51.                 if (!dbExist) {
  52.                         this.getReadableDatabase();
  53.                         try {
  54.                                 copyDataBase();
  55.                         } catch (IOException e) {
  56.                                 Log.e(this.getClass().toString(), "Copying error");
  57.                                 throw new Error("Error copying database!");
  58.                         }
  59.                 } else {
  60.                         Log.i(this.getClass().toString(), "Database already exists");
  61.                 }
  62.         }
  63.         //Проверка существования базы данных
  64.         private boolean checkDataBase() {
  65.                 SQLiteDatabase checkDb = null;
  66.                 try {
  67.                         String path = DB_PATH + DB_NAME;
  68.                         checkDb = SQLiteDatabase.openDatabase(path, null,
  69.                                         SQLiteDatabase.OPEN_READONLY);
  70.                 } catch (SQLException e) {
  71.                         Log.e(this.getClass().toString(), "Error while checking db");
  72.                 }
  73.                 //Андроид не любит утечки ресурсов, все должно закрываться
  74.                 if (checkDb != null) {
  75.                         checkDb.close();
  76.                 }
  77.                 return checkDb != null;
  78.         }
  79.         //Метод копирования базы
  80.         private void copyDataBase() throws IOException {
  81.                 // Открываем поток для чтения из уже созданной нами БД
  82.                 //источник в assets
  83.                 InputStream externalDbStream = context.getAssets().open(DB_NAME);
  84.  
  85.                 // Путь к уже созданной пустой базе в андроиде
  86.                 String outFileName = DB_PATH + DB_NAME;
  87.  
  88.                 // Теперь создадим поток для записи в эту БД побайтно
  89.                 OutputStream localDbStream = new FileOutputStream(outFileName);
  90.  
  91.                 // Собственно, копирование
  92.                 byte[] buffer = new byte[1024];
  93.                 int bytesRead;
  94.                 while ((bytesRead = externalDbStream.read(buffer)) > 0) {
  95.                         localDbStream.write(buffer, 0, bytesRead);
  96.                 }
  97.                 // Мы будем хорошими мальчиками (девочками) и закроем потоки
  98.                 localDbStream.close();
  99.                 externalDbStream.close();
  100.  
  101.         }
  102.  
  103.         public SQLiteDatabase openDataBase() throws SQLException {
  104.                 String path = DB_PATH + DB_NAME;
  105.                 createDataBase();
  106.                 if (database == null) {
  107.                         createDataBase();
  108.                         database = SQLiteDatabase.openDatabase(path, null,
  109.                                 SQLiteDatabase.OPEN_READWRITE);
  110.                 }
  111.                 return database;
  112.         }
  113.         @Override
  114.         public synchronized void close() {
  115.                 if (database != null) {
  116.                         database.close();
  117.                 }
  118.                 super.close();
  119.         }
  120.         @Override
  121.         public void onCreate(SQLiteDatabase db) {}
  122.         @Override
  123.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
  124. }


Вот так записываю данные:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. ExternalDbOpenHelper extdb = new ExternalDbOpenHelper(this, DB_NAME);
  2. db = extdb.openDataBase();
  3. String sql = "INSERT INTO Data(data, title,  ves, kkal100, itogo)  VALUES ("+"'"+date_time+"'"+","+"'"+title+"'"+","+"'"+ves+"'"+","+"'"+kkal100+"'"+","+"'"+itogo_str+"'"+")";
  4.                                                 db.execSQL(sql);
  5. Obnovut_spiner_iz_bazy();
  6.  


Spinner обновляется и новая строчка в нем появляется. Но как только переоткрою активити, то никаких изменений в БД не замечается. Т.е. она не записалась :-(


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 16 мар 2013, 00:36 

Зарегистрирован: 16 мар 2013, 00:27
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
beeline09 писал(а):
Spinner обновляется и новая строчка в нем появляется. Но как только переоткрою активити, то никаких изменений в БД не замечается. Т.е. она не записалась :-(


Брат, ты все-таки дело с БД имеешь :)
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. ExternalDbOpenHelper extdb = new ExternalDbOpenHelper(this, DB_NAME);
  2. db = extdb.openDataBase();
  3.                         try {
  4.                                 db.beginTransaction();
  5.  
  6.                                                    String sql = "INSERT INTO Data(data, title,  ves, kkal100, itogo)  VALUES ("+"'"+date_time+"'"+","+"'"+title+"'"+","+"'"+ves+"'"+","+"'"+kkal100+"'"+","+"'"+itogo_str+"'"+")";
  7.                                 db.execSQL(sql);
  8.  
  9.                                 db.setTransactionSuccessful();
  10.                         } catch (SQLException e) {
  11.                         } finally {
  12.                                 db.endTransaction();
  13.                         }
  14. Obnovut_spiner_iz_bazy();
  15.  
  16.  


без транзакции фиг что в базу запишется :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 18 мар 2013, 08:07 

Зарегистрирован: 23 сен 2012, 23:10
Сообщений: 33
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
MoonNah писал(а):

без транзакции фиг что в базу запишется :)

А что мне даст это? Если у меня база одна. Доступ к ней только из одной активти, пишу в нее только в том куске кода, который указал выше, курсор закрывается каждый раз. И что значит фиг знает что? Хочешь сказать, что разные значения не в свои столбцы могут попасть?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 21 мар 2013, 01:40 

Зарегистрирован: 16 мар 2013, 00:27
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
beeline09 писал(а):
А что мне даст это?


так, давай определимся, ты хочешь подискутировать на эту тему, или хочешь чтобы данные сохранились в базе , если второе, то используй транзакцию, потому что
1. при таком подходе база будет залочена для любого другого обращения (сам ты не сможешь это гарантировать на 100%)
2. в базу запишется корректно инфа, если там будут ошибки, то все откатится и не положит базу
3. Самое главное, что информация физически запишется в файл базы данных

Короче проверяй и убедишься (просто я так работаю в своей программе переводчике и программе контроля за автомобилем со спутниковой сигналкой и неоднократно сталкивался с подобным вопросом, а на начальном этапе и сам ловил такую плюху, да и мануал SQLite, как и у других БД, рекомендует пользовать транзакции).

И еще нафига ты такое в запросе нагородил (куча ненужных плюсов и кавычек)

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.   String sql = "INSERT INTO Data(data, title,  ves, kkal100, itogo)  VALUES ("+"'"+date_time+"'"+","+"'"+title+"'"+","+"'"+ves+"'"+","+"'"+kkal100+"'"+","+"'"+itogo_str+"'"+")";


когда гораздо удобоваримее написать было так
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.   String sql = "INSERT INTO Data(data, title,  ves, kkal100, itogo)  VALUES ('"+date_time+"', '"+title+"', '"+ves+"', '"+kkal100+"', '"+itogo_str+"')";


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 21 мар 2013, 12:22 

Зарегистрирован: 23 сен 2012, 23:10
Сообщений: 33
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
MoonNah писал(а):
beeline09 писал(а):
А что мне даст это?


так, давай определимся, ты хочешь подискутировать на эту тему, или хочешь чтобы данные сохранились в базе , если второе, то используй транзакцию, потому что
1. при таком подходе база будет залочена для любого другого обращения (сам ты не сможешь это гарантировать на 100%)
2. в базу запишется корректно инфа, если там будут ошибки, то все откатится и не положит базу
3. Самое главное, что информация физически запишется в файл базы данных

Короче проверяй и убедишься (просто я так работаю в своей программе переводчике и программе контроля за автомобилем со спутниковой сигналкой и неоднократно сталкивался с подобным вопросом, а на начальном этапе и сам ловил такую плюху, да и мануал SQLite, как и у других БД, рекомендует пользовать транзакции).

И еще нафига ты такое в запросе нагородил (куча ненужных плюсов и кавычек)

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.   String sql = "INSERT INTO Data(data, title,  ves, kkal100, itogo)  VALUES ("+"'"+date_time+"'"+","+"'"+title+"'"+","+"'"+ves+"'"+","+"'"+kkal100+"'"+","+"'"+itogo_str+"'"+")";


когда гораздо удобоваримее написать было так
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.   String sql = "INSERT INTO Data(data, title,  ves, kkal100, itogo)  VALUES ('"+date_time+"', '"+title+"', '"+ves+"', '"+kkal100+"', '"+itogo_str+"')";


Хорошо, не могу не согласиться - сделаю в следующей версии. Сейчас уже обновленная в маркете лежит.
А на счет запроса да, торопился вот и нагородил. Я это уже исправил ))
Спасибо за помощь!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 13 фев 2014, 17:55 

Зарегистрирован: 13 фев 2014, 17:48
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
tyapavel писал(а):
Понятно. Изменил суперкласс. Теперь Actyvity.onDestroy() можно не переопределять.
Код: [ Загрузить ] [ Скрыть ]
  1. import java.io.File; 
  2. import android.content.Context; 
  3. import android.database.sqlite.SQLiteDatabase; 
  4. import android.os.Environment; 
  5.  
  6. public abstract class MyDataBaseOpenHelper { 
  7.  
  8.         private SQLiteDatabase db; 
  9.         private File dbFile; 
  10.         private String dbName; 
  11.         private boolean isExistDB; 
  12.  
  13.         public MyDataBaseOpenHelper(Context context, String dbName) { 
  14.             super(); 
  15.             this.isExistDB = false; 
  16.             this.dbName = dbName; 
  17.             this.prepareBD(); 
  18.             if(!this.isExistDB){ 
  19.                     onCreate(db); 
  20.             } 
  21.             db.close(); 
  22.         } 
  23.          
  24.         private void prepareBD() { 
  25.             try{ 
  26.                 File sdCard = Environment.getExternalStorageDirectory(); 
  27.                 File directory = new File(sdCard.getAbsolutePath () + "/" + dbName); 
  28.                 directory.mkdirs(); 
  29.                 dbFile = new File(directory, dbName); 
  30.                 if(dbFile.exists())this.isExistDB=true; 
  31.                 this.db = SQLiteDatabase.openOrCreateDatabase(dbFile, null); 
  32.             }catch (Exception e) {} 
  33.         } 
  34.  
  35.         abstract public void onCreate(SQLiteDatabase db); 
  36.          
  37.         abstract public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion); 
  38.  
  39.         public void close(){ 
  40.                 db.close(); 
  41.         } 
  42.          
  43.         public SQLiteDatabase getReadableDatabase(){ 
  44.             SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE); 
  45.             return resdDb; 
  46.         } 
  47.  
  48.         public SQLiteDatabase getWritableDatabase(){ 
  49.             SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE); 
  50.             return resdDb; 
  51.         } 


Не могу понять как поменять в данном случае версию базы? Создаваемая база всегда имеет версию "0".


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SQLite на SD карте
СообщениеДобавлено: 13 фев 2014, 19:07 
Аватар пользователя

Зарегистрирован: 13 ноя 2013, 14:46
Сообщений: 1956
Благодарил (а): 10 раз.
Поблагодарили: 275 раз.
AnDron писал(а):
tyapavel писал(а):
Понятно. Изменил суперкласс. Теперь Actyvity.onDestroy() можно не переопределять.
Код: [ Загрузить ] [ Скрыть ]
  1. import java.io.File; 
  2. import android.content.Context; 
  3. import android.database.sqlite.SQLiteDatabase; 
  4. import android.os.Environment; 
  5.  
  6. public abstract class MyDataBaseOpenHelper { 
  7.  
  8.         private SQLiteDatabase db; 
  9.         private File dbFile; 
  10.         private String dbName; 
  11.         private boolean isExistDB; 
  12.  
  13.         public MyDataBaseOpenHelper(Context context, String dbName) { 
  14.             super(); 
  15.             this.isExistDB = false; 
  16.             this.dbName = dbName; 
  17.             this.prepareBD(); 
  18.             if(!this.isExistDB){ 
  19.                     onCreate(db); 
  20.             } 
  21.             db.close(); 
  22.         } 
  23.          
  24.         private void prepareBD() { 
  25.             try{ 
  26.                 File sdCard = Environment.getExternalStorageDirectory(); 
  27.                 File directory = new File(sdCard.getAbsolutePath () + "/" + dbName); 
  28.                 directory.mkdirs(); 
  29.                 dbFile = new File(directory, dbName); 
  30.                 if(dbFile.exists())this.isExistDB=true; 
  31.                 this.db = SQLiteDatabase.openOrCreateDatabase(dbFile, null); 
  32.             }catch (Exception e) {} 
  33.         } 
  34.  
  35.         abstract public void onCreate(SQLiteDatabase db); 
  36.          
  37.         abstract public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion); 
  38.  
  39.         public void close(){ 
  40.                 db.close(); 
  41.         } 
  42.          
  43.         public SQLiteDatabase getReadableDatabase(){ 
  44.             SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE); 
  45.             return resdDb; 
  46.         } 
  47.  
  48.         public SQLiteDatabase getWritableDatabase(){ 
  49.             SQLiteDatabase resdDb = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE); 
  50.             return resdDb; 
  51.         } 


Не могу понять как поменять в данном случае версию базы? Создаваемая база всегда имеет версию "0".

ответ в этой строчке: abstract public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
т.е. базу нужно не создавать а обновлять. Но это именно в этом случае.

_________________
Изображение


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB