Розташування бази даних sqlite на пристрої


100

Я створив базу даних sqlite програмно із способом розширення SQLiteOpenHelperта перевизначення за замовчуванням onCreate(). Таким чином, db створюється на льоту, коли це необхідно.

Я хотів би перевірити вміст db-файлу на моїй машині OS X за допомогою браузера sqlite. Я знаю ім'я db-файлу, але не можу його знайти на пристрої. Я підключився до пристрою через USB і шукав пошук і термінал, але я просто не можу знайти файл db.

Яке місце за замовчуванням для баз даних sqlite на пристрої Android?


Дивіться тут: програмно
проходьте

Відповіді:


96

Ви можете знайти створену базу даних з назвою <your-database-name>

в

//data/data/<Your-Application-Package-Name>/databases/<your-database-name>

Витягніть його за допомогою File Explorer і перейменуйте його, щоб мати розширення .db3, щоб використовувати його в SQLiteExplorer

Використовуйте Провідник файлів DDMS для переходу до каталогу емуляторів.


1
Коли я спробую це в емуляторі, я можу записати CD / data. Але коли я спробую це зі своїм підключеним Galaxy Vibrant, я не можу записати CD / data. Чи працює сервер adb в різних випадках?
Robᵩ

42
У вас немає доступу до папки / data на реальному телефоні. Це chmoded 700. Для його отримання потрібні кореневі привілеї.
Фальмарі

15
На всякий випадок, якщо ви хочете отримати шлях від програми , це context.getDatabasePath ("<ім'я вашої дани>"). Що насправді повертає шлях вище. Ви можете отримати доступ до цього шляху для читання-запису, але тільки з програми, яка створила базу даних.
Ярослав Миткалик

Шлях за замовчуванням, де Android зберігає бази даних, не може бути доступним на не вкорінених пристроях. Отже, найпростіший спосіб отримати доступ до файлу бази даних (тільки для налагоджувальних середовищ) - це змінити конструктор класу. Після деяких відповідей (саме тут: stackoverflow.com/a/21832714/2982814 ), ви дізнаєтесь, як мені це вдалося.
RandomUser

Дивіться тут: програмно
проходьте

45

Для цього я і зробив

File f=new File("/data/data/your.app.package/databases/your_db.db3");
FileInputStream fis=null;
FileOutputStream fos=null;

try
{
  fis=new FileInputStream(f);
  fos=new FileOutputStream("/mnt/sdcard/db_dump.db");
  while(true)
  {
    int i=fis.read();
    if(i!=-1)
    {fos.write(i);}
    else
    {break;}
  }
  fos.flush();
  Toast.makeText(this, "DB dump OK", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
  e.printStackTrace();
  Toast.makeText(this, "DB dump ERROR", Toast.LENGTH_LONG).show();
}
finally
{
  try
  {
    fos.close();
    fis.close();
  }
  catch(IOException ioe)
  {}
}

А для цього ваш додаток повинен мати дозвіл на доступ до SD-карти, додати наступні налаштування до свого manifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Не блискучий спосіб, але працює.


Приємно. Я це шукав. Можна також вибрати повний db на сервер для аналізу таким чином.
Jeroen

3
якщо це не працює ... використовуйте ім’я бази даних "/data/data/your.app.package/databases/your_db" Просто видаліть розширення ".db3"
Nigel Crasto

1
Це рішення прекрасно працює. Але ви можете використовувати getDatabasePath (your_db_name), щоб отримати об'єкт File, а використовувати getAbsolutePath (), щоб отримати точний шлях замість його побудови. Метод getDatabasePath визначений у ContextWrapper.
Рой

Назви файлів і шляхів в Android залежать від регістру.
AndroidDev

29

Контекст містить багато функцій шляху: Context.getXXXPath ()
Однією з них є android.content.Context.getDatabasePath (String dbname), який повертає абсолютний шлях бази даних під назвою dbname.

Context ctx = this; // for Activity, or Service. Otherwise simply get the context.
String dbname = "mydb.db";
Path dbpath = ctx.getDatabasePath(dbname);

Повернений шлях у цьому випадку буде чимось таким:

/data/data/com.me.myapp/databases/mydb.db

Зауважте, що цей шлях автоматично генерується, якщо для відкриття БД використовується SQLiteOpenHelper.


25

Якщо ви говорите про реальний пристрій, /data/data/<application-package-name>це неможливо. Ви повинні мати права root ...


Це не зовсім так. Це не можна переглядати , але доступність файлів всередині залежить від їх окремих дозволів.
Кріс Страттон

Мій телефон укорінений. Як я можу "переглядати" папку даних?
Sreecharan Desabattula

@SreecharanDesabattula, вам потрібно перейти до оболонки adb та перейти до суперпользователя за допомогою команди "su" для перегляду каталогу.
Gautham C.

/ Система / бен / ш: су: чи не знайдено
Sunnyday

@Sunnyday Trysudo su
Mohammedsalim Shivani

19

Це і старе питання, але відповісти може допомогти іншим.

Шлях за замовчуванням, де Android зберігає бази даних, не може бути доступним на не вкорінених пристроях. Отже, найпростіший спосіб отримати доступ до файлу бази даних (лише для налагоджувальних середовищ) - це змінити конструктор класу:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "/mnt/sdcard/database_name.db", null, 0);
    }
}

Не забудьте змінити для виробничого середовища за допомогою цих рядків:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}

Я спробував це і повернув помилку Failed to open database '/mnt/sdcard/itens'.вLogcat
underfilho

1
Мені дуже шкода. Ця відповідь чотири роки. І ОП старший за це (2010 р.). Наразі Android значно відрізняється від 2010 року. Тож розташування бази даних може бути іншим шляхом. Вибачте, я не можу вам більше допомогти.
Випадковийкористувач

Можливо, помилка сталася через те, що додатку заборонено писати, все-таки спасибі
underfilho


9

База даних SQLite - це лише файл. Ви можете взяти цей файл, перемістити його і навіть скопіювати його в іншу систему (наприклад, з телефону на робочу станцію), і він буде добре працювати. Android зберігає файл у /data/data/packagename/databases/каталозі. Ви можете використовувати adb commandабо File Explorer viewв Eclipse ( Window > Show View > Other... > Android > File Explorer) для його перегляду, переміщення чи видалення.


9

ну це може пізно, але це допоможе. Ви можете отримати доступ до бази даних, не вкорінюючи свій пристрій через adb

запустіть adb за допомогою cmd та введіть наступні команди

-run-as com.your.package  
-shell@android:/data/data/com.your.package $ ls  
cache  
databases  
lib  
shared_prefs  

Тепер ви можете відкрити звідси далі.


4
Так, для налагодження APK. Ні, для виробничої версії (або в Android-релізах, коли робота працює).
Кріс Страттон

5

Якщо ви назвали свій db як файл, не вказуючи шлях, то найпоширеніший спосіб отримати його папку такий:

final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);

де DBAdapter.DATABASE_NAMEпросто Stringяк "mydatabase.db".
Context.getFilesDir()повертає шлях до файлів програми, таких як: /data/data/<your.app.packagename>/files/ось чому вам потрібно .getParent()+"/databases/", щоб видалити "файли" і замість цього додати "бази даних".
BTW Eclipse попередить вас про жорстко закодовану рядок "data / data /", але не в цьому випадку.


3
By Default it stores to:    

String DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;

Where:

String DATABASE_NAME = "your_dbname";
String PACKAGE_NAME = "com.example.your_app_name";

І перевірте, чи зберігається ваша база даних у Device Storage. Якщо так, вам потрібно скористатися дозволом у Manifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3

Ви можете отримати доступ до нього за допомогою інструкції з оболонки adb

Вміст зверху:

Підручник: Як отримати доступ до бази даних Android за допомогою командного рядка. Коли ви починаєте мати справу з базою даних у вашій програмі, дуже важливо і корисно мати можливість отримати доступ до неї безпосередньо, поза вашою програмою, щоб перевірити, що програма щойно зробила, і налагодити.

І це важливо і на Android.

Ось як це зробити:

1) Запустіть емулятор (або підключіть реальний пристрій до ПК). Зазвичай для цього я запускаю одну зі своїх програм від Eclipse. 2) Запустіть командний рядок у каталозі інструментів Android. 3) введіть оболонку adb. Це запустить оболонку unix на вашому емуляторі / підключеному пристрої. 4) перейдіть до каталогу, де знаходиться ваша база даних: CD-дані / дані, тут у вас є список усіх програм на вашому пристрої. Перейдіть у каталог додатків (будьте уважні, Unix чутливий до регістру !!) cd com.alocaly.LetterGame та спустіться у вашому каталозі баз даних: CD-бази даних Тут ви можете знайти всі ваші бази даних. У моєму випадку є лише одне (зараз): SCORE_DB 5) Запустіть sqlite в базі даних, яку ви хочете перевірити / змінити: sqlite3 SCORE_DB Звідси ви можете перевірити, які таблиці наявні: .tables 6) введіть будь-яку інструкцію SQL, яку ви хочете : виберіть * з Оцінки;

Це досить просто, але кожен раз, коли мені це потрібно, я не знаю, де його знайти.


1

Якщо ваша програма створює базу даних, ця база даних за замовчуванням зберігається в каталозі DATA/data/APP_NAME/databases/FILENAME.

Частини вищевказаного каталогу побудовані на основі наступних правил. DATA - це шлях, який повертає метод Environment.getDataDirectory (). APP_NAME - ваше ім’я програми. FILENAME - ім’я, яке ви вказали у коді програми для бази даних.


0

Ви також можете перевірити, чи є у вашого IDE така утиліта, як DDMS перспектива Eclipse, яка дозволяє переглядати каталог та / або копіювати файли в емулятор і з нього або з корінним пристроєм.


0

Визначте ім’я бази даних, наприклад:

private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db";

І ви можете бачити свою базу даних у:

storage/sdcard0/yourdatabasename.db

0

публічний клас MySQLiteOpenHelper розширює SQLiteOpenHelper {MySQLiteOpenHelper (контекст контексту) {super (контекст, "/mnt/sdcard/database_name.db", null, 0); }}

Не жорсткий код "/ sdcard /"; використовуйте натомість Environment.getExternalStorageDirectory (). getPath ()


0

Не жорсткий код, як //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Добре це працює в більшості випадків, але цей не працює на пристроях, де пристрій може підтримувати декількох користувачів. Шлях може бути таким //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Можливим рішенням цього є використання context.getDatabasePath(<your-database-name>).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.