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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 116
#1

База данных на карте памяти - Android

01.06.2013, 21:36. Просмотров 1381. Ответов 8
Метки нет (Все метки)

У меня приложение создаёт базу данных, но она создаётся в памяти телефона. Скажите как сделать чтобы она сохранялась на карте памяти?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2013, 21:36     База данных на карте памяти
Посмотрите здесь:

Андроид и база данных Android
Android база данных
Android Поиск mp3 файлов на телефоне/ карте памяти
База данных! Android
База данных! Android
База данных Android
Путь к карте памяти Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.06.2013, 13:51     База данных на карте памяти #2
http://stackoverflow.com/questions/7...ase-on-sd-card
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 116
02.06.2013, 14:39  [ТС]     База данных на карте памяти #3
Тоже находил этот пример. Но почему-то везде одна и та же ошибка: sqlite3_open_v2("/sdcard/mydb", &handle, 2, NULL) failed. Только вместо цифры 2 бывают другие. И после этого эклипс перестаёт вообще запускать приложение, приходится его перезапускать
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.06.2013, 14:58     База данных на карте памяти #4
нужен полный лог чтобы что-то понять.

Добавлено через 1 минуту
может пермишенов не прописали?

Добавлено через 1 минуту
попробуйте заменить метод openDatabase на openOrCreateDatabase
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 116
02.06.2013, 15:49  [ТС]     База данных на карте памяти #5
В манифесте добавлено в графе <application ... android: permission="android.permission.WRITE_EXTERNAL_STORAGE"
Вот взятый из примера код:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package com.example.test;
 
import java.io.File;
 
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Environment;
import android.util.Log;
 
public class DatabaseHelper {
    
    private static final String TAG = "DatabaseHelper";
 
    public static final String  DATABASE_NAME = "mydb"; 
    public static final String  TRACKS_TABLE = "tracks";
    public static final String  TRACK_INFO_TABLE = "track_info";
 
    private static final String TRACKS_TABLE_CREATE = "create table "
           + TRACKS_TABLE
           + " (_id integer primary key autoincrement, " +
           "title text not null, description text null, " +
           "created_at date not null);";
 
    private static final String TRACK_INFO_TABLE_CREATE = "create table " 
           + TRACK_INFO_TABLE 
           + " (_id integer primary key autoincrement, track_id integer not null, " +
           "latitude real not null, longitude real not null, altitude real not null, " +
           "created_at date not null);";
 
    private SQLiteDatabase database;
 
    
    public DatabaseHelper() 
    {  
        try
        {
            database = SQLiteDatabase.openOrCreateDatabase(Environment.getExternalStorageDirectory()
                    + File.separator + DATABASE_NAME, null);
        }
        catch (SQLiteException ex)
        {
            Log.e(TAG, "error -- " + ex.getMessage(), ex);
            // error means tables does not exits
            createTables();
        }
        finally
        {
            database.close();
        }
        
    }
 
        private void createTables()
        {
            database.execSQL(TRACKS_TABLE_CREATE);
            database.execSQL(TRACK_INFO_TABLE_CREATE);
        }
 
        public void close()
        {
            database.close();
        }
 
        public SQLiteDatabase getReadableDatabase()
        {
            database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
                    + File.separator + DATABASE_NAME, null,
                    SQLiteDatabase.OPEN_READONLY);
            return database;
        }
 
        public SQLiteDatabase getWritableDatabase()
        {
            database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
                    + File.separator + DATABASE_NAME, null,
                    SQLiteDatabase.OPEN_READWRITE);
            return database;
        }
        
}
Изменил только DBUtil.safeCloseDataBase(database); на database.close(); т.к. Эклипс не знал что такое DBUtil.

В MainActivity только DatabaseHelper DB = new DatabaseHelper();

Вот весь лог:
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
06-02 11:30:58.675: E/Database(247): sqlite3_open_v2("/sdcard/mydb", &handle, 6, NULL) failed
06-02 11:30:58.684: E/DatabaseHelper(247): error -- unable to open database file
06-02 11:30:58.684: E/DatabaseHelper(247): android.database.sqlite.SQLiteException: unable to open database file
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:659)
06-02 11:30:58.684: E/DatabaseHelper(247):  at com.example.test.DatabaseHelper.<init>(DatabaseHelper.java:37)
06-02 11:30:58.684: E/DatabaseHelper(247):  at com.example.test.MainActivity.onCreate(MainActivity.java:38)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.app.ActivityThread.access$2100(ActivityThread.java:116)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.os.Looper.loop(Looper.java:123)
06-02 11:30:58.684: E/DatabaseHelper(247):  at android.app.ActivityThread.main(ActivityThread.java:4203)
06-02 11:30:58.684: E/DatabaseHelper(247):  at java.lang.reflect.Method.invokeNative(Native Method)
06-02 11:30:58.684: E/DatabaseHelper(247):  at java.lang.reflect.Method.invoke(Method.java:521)
06-02 11:30:58.684: E/DatabaseHelper(247):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
06-02 11:30:58.684: E/DatabaseHelper(247):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
06-02 11:30:58.684: E/DatabaseHelper(247):  at dalvik.system.NativeStart.main(Native Method)
06-02 11:30:58.704: D/AndroidRuntime(247): Shutting down VM
06-02 11:30:58.704: W/dalvikvm(247): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
06-02 11:30:58.704: E/AndroidRuntime(247): Uncaught handler: thread main exiting due to uncaught exception
06-02 11:30:58.715: E/AndroidRuntime(247): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.NullPointerException
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.app.ActivityThread.access$2100(ActivityThread.java:116)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.os.Looper.loop(Looper.java:123)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.app.ActivityThread.main(ActivityThread.java:4203)
06-02 11:30:58.715: E/AndroidRuntime(247):  at java.lang.reflect.Method.invokeNative(Native Method)
06-02 11:30:58.715: E/AndroidRuntime(247):  at java.lang.reflect.Method.invoke(Method.java:521)
06-02 11:30:58.715: E/AndroidRuntime(247):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
06-02 11:30:58.715: E/AndroidRuntime(247):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
06-02 11:30:58.715: E/AndroidRuntime(247):  at dalvik.system.NativeStart.main(Native Method)
06-02 11:30:58.715: E/AndroidRuntime(247): Caused by: java.lang.NullPointerException
06-02 11:30:58.715: E/AndroidRuntime(247):  at com.example.test.DatabaseHelper.<init>(DatabaseHelper.java:48)
06-02 11:30:58.715: E/AndroidRuntime(247):  at com.example.test.MainActivity.onCreate(MainActivity.java:38)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
06-02 11:30:58.715: E/AndroidRuntime(247):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
06-02 11:30:58.715: E/AndroidRuntime(247):  ... 11 more
06-02 11:30:58.734: I/dalvikvm(247): threadid=7: reacting to signal 3
06-02 11:30:58.734: E/dalvikvm(247): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
Может не так permission прописываю? Потому что пока не уберу эту строчку приложение вообще не запускается, только устанавливается на avd
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.06.2013, 16:00     База данных на карте памяти #6
попробуйте добавить пермишен на чтение и ".db" к имени базы.

Добавлено через 47 секунд
Цитата Сообщение от igrok-vip Посмотреть сообщение
Caused by: java.lang.NullPointerException
06-02 11:30:58.715: E/AndroidRuntime(247): *at com.example.test.DatabaseHelper.<init>(DatabaseHelper.java:48)
!!!
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 116
02.06.2013, 16:29  [ТС]     База данных на карте памяти #7
Добавление .db в DATABASE_NAME не помогло.

А что это
06-02 11:30:58.715: E/AndroidRuntime(247): *at com.example.test.DatabaseHelper.<init>(DatabaseHelper.java:4 8)
означает?
Что ошибка в файле DatabaseHelper на 48 строке?
Так там как раз та строчка которую я заменил на database.close(); т.к. еклипс не знает что такое DBUtil
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.06.2013, 16:38     База данных на карте памяти #8
а пермишены на чтение добавили?


Цитата Сообщение от igrok-vip Посмотреть сообщение
А что это
06-02 11:30:58.715: E/AndroidRuntime(247): *at com.example.test.DatabaseHelper.<init>(DatabaseHelper.java:4 8)
означает?
Что ошибка в файле DatabaseHelper на 48 строке?
добавьте проверку database на null
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2013, 17:49     База данных на карте памяти
Еще ссылки по теме:

ListView, База данных и SimpleCursorAdapter - onItemClick срабатывает только после добавления данных Android
Android Получить путь к карте памяти (SD card)
Android База данных
Android Не получается получить путь к карте памяти
Android Получить доступ к внешней карте памяти (Android 6)

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

Или воспользуйтесь поиском по форуму:
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 116
02.06.2013, 17:49  [ТС]     База данных на карте памяти #9
Да всё дело было в разрешениях. Я ставил только одно на запись и не туда
нужно было не в <application ... android: permission="android.permission.WRITE_EXTERNAL_STORAGE"
а в
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE">
</uses-permission>

В общем сейчас база создаётся на карте памяти, только в ней только таблица android_metadata и всё
Yandex
Объявления
02.06.2013, 17:49     База данных на карте памяти
Ответ Создать тему
Опции темы

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