デバイス上のsqliteデータベースの場所


100

拡張SQLiteOpenHelperと上書きのデフォルトの方法を使用して、プログラムでsqliteデータベースを作成しましたonCreate()。このようにして、必要なときにデータベースがその場で作成されます。

OS Xマシンのdbファイルの内容をsqliteブラウザーで確認したいのですが。dbファイルの名前は知っていますが、デバイス上で見つけることができません。USB経由でデバイスに接続し、ファインダーとターミナルで確認しましたが、dbファイルが見つかりません。

Androidデバイス上のsqliteデータベースのデフォルトの場所は何ですか?


回答:


96

という名前の作成したデータベースを見つけることができます <your-database-name>

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

ファイルエクスプローラーを使用して引き出し、SQLiteExplorerで使用するために.db3拡張子を持つように名前を変更します。

DDMSのファイルエクスプローラーを使用して、エミュレーターのディレクトリに移動します。


1
エミュレータでそれを試すと、/ dataにcdできます。しかし、接続したGalaxy Vibrantでそれを試すと、/ dataにcdできません。これら2つのケースでは、adbサーバーは別の用途として実行されますか?
Robᵩ

42
実際の電話の/ dataフォルダーにアクセスできません。chmoded 700です。これを表示するには、root権限が必要です。
Falmarri 2010

15
アプリからパスを取得したい場合に備えて、それはcontext.getDatabasePath( "<your-database-name>")です。実際には上記のパスを返します。このパスには、読み書き用にアクセスできますが、データベースを作成したアプリケーションからのみアクセスできます。
Yaroslav Mytkalyk 2014年

Androidがデータベースを保存するデフォルトのパスは、ルート化されていないデバイスではアクセスできません。したがって、データベースファイルにアクセスする最も簡単な方法(デバッグ環境のみ)は、クラスのコンストラクターを変更することです。これの後のいくつかの回答(正確にはここ:stackoverflow.com/a/21832714/2982814)、私がこれをどのように管理したかがわかります。
RandomUser 2017

ここを参照してください:プログラムでデータベースパスを取得
shizhen

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" />

素晴らしい方法ではありませんが、動作します。


いいね。これを探していました。この方法で分析するために、完全なデータベースをサーバーにアップロードすることもできます。
Jeroen 2013年

3
それが機能しない場合...データベース名「/data/data/your.app.package/databases/your_db」を使用します。拡張子「.db3」を削除するだけ
です

1
このソリューションは正常に動作します。ただし、getDatabasePath(your_db_name)を使用してFileオブジェクトを取得し、getAbsolutePath()を使用してそれを構築する代わりに正確なパスを取得できます。getDatabasePathメソッドはContextWrapperで定義されています。
Roy

Androidでは、ファイル名とパス名は大文字と小文字が区別されます。
AndroidDev 2016年

29

Contextには多くのパス関数が含まれています。Context.getXXXPath()
それらの1つは、dbnameというデータベースの絶対パスを返すandroid.content.Context.getDatabasePath(String 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を使用してDBを開く場合、このパスは自動生成されることに注意してください。


25

実際のデバイスについて話している場合/data/data/<application-package-name>はアクセスできません。root権限が必要です...


それは正確には当てはまりません。閲覧できませんが、ファイル内のアクセス可能性は、個々の許可ビットによって異なります。
Chris Stratton

私の電話は根付いています。データフォルダを「参照」するにはどうすればよいですか?
Sreecharan Desabattula 2014

@SreecharanDesabattulaの場合、adbシェルに移動し、「su」コマンドを使用してスーパーユーザーに切り替えて、ディレクトリを参照する必要があります。
Gautham C.

/ system / bin / sh:su:not found
Sunnyday

@Sunnyday Trysudo su
Mohammedsalim

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
ごめんなさい。この答えは4歳です。そしてOPはそれより古い(2010)。現時点では、Androidは2010と大きく異なります。そのため、データベースの場所が別のパスにある可能性があります。お役に立てず申し訳ありません。
RandomUser 2018

おそらく、とにかくアプリが書き込みを許可されなかったためにエラーが発生した可能性があります
アンダーフィル


9

SQLiteデータベースは単なるファイルです。そのファイルを取得して移動し、別のシステムにコピーすることもできます(たとえば、電話からワークステーションに)。これで問題なく動作します。Androidはファイルを/data/data/packagename/databases/ディレクトリに保存します。Eclipse のadb commandまたはを使用して、それを表示、移動、または削除できます。File Explorer viewWindow > Show View > Other... > Android > File Explorer


9

まあこれは遅いかもしれませんが、それは役立ちます。adbを介してデバイスをルート化せずにデータベースにアクセスできます

cmdを使用してadbを起動し、次のコマンドを入力します

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

これで、ここから開くことができます。


4
はい、デバッグAPK用です。いいえ、製品版(またはrun-asが壊れているAndroidリリースの場合)。
Chris Stratton

5

パスを指定せずにデータベースにファイル名を付けると、そのフォルダーを取得する最も一般的な方法は次のようになります。

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

「mydatabase.db」のような場所DBAdapter.DATABASE_NAMEですString
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" />

3

adb shell how-toを使用してアクセスできます

上記のリンクのコンテンツ:

チュートリアル:コマンドラインを使用してAndroidデータベースにアクセスする方法。プログラムでデータベースを扱う場合、プログラムの外部で直接データベースにアクセスできること、プログラムが実行した内容を確認すること、およびデバッグすることが非常に重要で便利です。

そして、それはAndroidでも重要です。

これを行う方法は次のとおりです。

1)エミュレータを起動します(または実際のデバイスをPCに接続します)。私は通常、このためにEclipseから自分のプログラムの1つを起動します。2)android toolsディレクトリでコマンドプロンプトを起動します。3)adb shellと入力します。これにより、エミュレータ/接続されたデバイスでUNIXシェルが起動します。4)データベースがあるディレクトリに移動します:cd data / dataここにデバイス上のすべてのアプリケーションのリストがありますアプリケーションディレクトリに移動します(注意:Unixでは大文字と小文字が区別されます!!)cd com.alocaly.LetterGame and descendデータベースディレクトリ:cdデータベースここにすべてのデータベースがあります。私の場合、1つだけ(今)があります: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にEclipseのDDMSパースペクティブのようなユーティリティがあり、ディレクトリを参照したり、エミュレータやルート化されたデバイスとの間でファイルをコピーしたりできるかどうかを確認することもできます。


0

次のようにデータベース名を定義します。

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

そして、あなたはあなたのデータベースを見ることができます:

storage/sdcard0/yourdatabasename.db

0

パブリッククラスMySQLiteOpenHelperはSQLiteOpenHelperを拡張します{MySQLiteOpenHelper(Context context){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>)です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.