Расположение базы данных sqlite на устройстве

100

Я создал базу данных sqlite программно со стандартным способом расширения SQLiteOpenHelperи замены onCreate(). Таким образом, база данных создается на лету, когда это необходимо.

Я хотел бы проверить содержимое файла db на моем компьютере с OS X с помощью браузера sqlite. Я знаю имя файла db, но не могу найти его на устройстве. Я подключился к устройству через USB и посмотрел с помощью Finder и терминала, но я просто не могу найти файл db.

Какое расположение по умолчанию для баз данных sqlite на устройстве Android?

Помпа
источник

Ответы:

96

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

в

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

Вытащите его с помощью File Explorer и переименуйте в расширение .db3, чтобы использовать его в SQLiteExplorer.

Используйте File Explorer DDMS, чтобы перейти в каталог эмулятора.

Шардул
источник
1
Когда я пробую это в эмуляторе, я могу перейти в / data. Но когда я пытаюсь это сделать с подключенным Galaxy Vibrant, я не могу выполнить cd в / data. В этих двух случаях сервер adb работает по-разному?
Robᵩ
42
У вас нет доступа к папке / data на реальном телефоне. Это изменено 700. Чтобы его увидеть, вам нужны права root.
Falmarri
15
На всякий случай, если вы хотите получить путь из приложения , это context.getDatabasePath ("<your-database-name>"). Что на самом деле возвращает путь, указанный выше. Вы можете получить доступ к этому пути для чтения и записи, но только из приложения, создавшего базу данных.
Ярослав Мыткалык
Путь по умолчанию, по которому Android сохраняет базы данных, нельзя использовать на некорневых устройствах. Итак, самый простой способ получить доступ к файлу базы данных (только для сред отладки) - изменить конструктор класса. Некоторые ответы после этого (именно здесь: stackoverflow.com/a/21832714/2982814 ), вы узнаете, как мне это удалось.
RandomUser 06
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" />

Не блестящий способ, но работает.

RRTW
источник
Ницца. Я искал это. Таким образом можно также загрузить полную базу данных на сервер для анализа.
Jeroen
3
если не работает ... используйте имя базы данных "/data/data/your.app.package/databases/your_db" Просто удалите расширение ".db3"
Найджел Красто
1
Это решение отлично работает. Но вы можете использовать getDatabasePath (your_db_name) для получения объекта File и использовать getAbsolutePath () для получения точного пути вместо его построения. Метод getDatabasePath определен в ContextWrapper.
Рой
Имена файлов и путей в Android чувствительны к регистру.
AndroidDev
30

Контекст содержит множество функций пути: 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.
/ system / bin / sh: su: not found
Sunnyday 03
@Sunnyday Trysudo su
Мохаммедсалим Шивани
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);
    }
}
RandomUser
источник
Я попробовал это и вернул ошибку Failed to open database '/mnt/sdcard/itens'.вLogcat
underfilho
2
Мне так жаль. Этому ответу четыре года. И ОП старше этого (2010 г.). В настоящее время Android значительно отличается от 2010 года. Таким образом, база данных может располагаться по другому пути. Мне очень жаль, что я ничем не могу вам помочь.
RandomUser
Возможно, ошибка произошла из-за того, что приложению не разрешено писать, в любом случае спасибо
underfilho
12

/data/data/packagename/databases/

т.е.

/data/data/com.example.program/databases/

Рэй Бриттон
источник
9

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

HalosTechnologies
источник
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, где не работает функция run-as).
Крис Стрэттон
5

Если вы назовете свою базу данных как файл без указания пути, тогда наиболее распространенный способ получить ее папку выглядит так:

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/"удалить «файлы» и вместо этого добавить «базы данных».
Кстати, 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";

И проверьте, хранится ли ваша база данных в хранилище устройства. Если это так, вы должны использовать разрешение в Manifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Crime_Master_GoGo
источник
3

Вы можете получить к нему доступ, используя инструкции по adb shell

Контент по ссылке выше:

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

И это важно еще и на Android.

Вот как это сделать:

1) Запустите эмулятор (или подключите реальное устройство к ПК). Обычно для этого я запускаю одну из своих программ из Eclipse. 2) Запустите командную строку в каталоге инструментов Android. 3) типа adb shell. Это запустит оболочку unix на вашем эмуляторе / подключенном устройстве. 4) перейдите в каталог, в котором находится ваша база данных: cd data / data здесь у вас есть список всех приложений на вашем устройстве. Войдите в каталог приложений (будьте осторожны, Unix чувствителен к регистру !!) cd com.alocaly.LetterGame и спуститесь. в каталоге ваших баз данных: cd databases Здесь вы можете найти все ваши базы данных. В моем случае есть только один (сейчас): SCORE_DB 5) Запустите sqlite в базе данных, которую вы хотите проверить / изменить: sqlite3 SCORE_DB Отсюда вы можете проверить, какие таблицы присутствуют: .tables 6) введите любую инструкцию SQL, которую хотите : выберите * из Score;

Это довольно просто, но каждый раз, когда мне это нужно, я не знаю, где это найти.

Давид Дрозд
источник
1

Если ваше приложение создает базу данных, эта база данных по умолчанию сохраняется в каталоге DATA/data/APP_NAME/databases/FILENAME.

Части указанного выше каталога построены на основе следующих правил. DATA - это путь, который возвращает метод Environment.getDataDirectory (). APP_NAME - это имя вашего приложения. FILENAME - это имя, которое вы указываете в коде приложения для базы данных.

AndroidGeek
источник
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 (context, "/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>).

Витаутас Беранкис
источник