4

別のアプリのデータベースを開きたい。ルートアクセスが必要なのはわかっていますが、ルートアクセスはシェルコマンドの「のみ」のようです。

データベースに多くの選択といくつかの挿入を行いたいです。ルートとしてデータベースを開き、「通常の」アプリでデータベースハンドルを操作することは可能ですか?

前もって感謝します

ビーバー

4

3 に答える 3

7

すべての答えをありがとう!唯一の方法は、次のようなものを作成することだと思います。

Process p = Runtime.getRuntime().exec("su sqlite3 -csv test.db \"select * from test\";");

次に、OutputStream を cvs パーサーで解析する必要があります....もっと簡単な方法で解析できることを望みましたが、解決策が見つかりません。

アプリのディレクトリ内のファイルへのハード リンクを作成できるかもしれませんが、1 つのデータベースに対して 2 つの「.journal」ファイルが存在するため、非常に危険です。

手伝ってくれてありがとう

ビーバー

于 2013-04-23T12:18:02.827 に答える
1

シェル コマンドを使用してルート アクセス権を持っている場合は、引き続きデータベースにアクセスできます。

例 :

mycomp$ adb shell
$ su
# cd com.android.providers.media
# ls
cache
databases
lib
shared_prefs
# cd databases
# ls
external.db
external.db-shm
external.db-wal
internal.db
internal.db-shm
internal.db-wal
# sqlite3 external.db
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select count(*) from images;
10
sqlite> 

使用されるツールは、sqlite データベースへのクライアント コマンドである sqlite3 です。データベース ファイルは通常、/data/data/com.someapp/databases/ にあります。

編集:待って...私はあなたの質問を読み直していました。自分のアプリから別のアプリのデータベースにアクセスしたいということですか?

編集 : 別のデータベースにアクセスする場合、そのデータベースはコンテンツ プロバイダーである必要があります。その最も良い例がメディア ライブラリです (上の画像の表は、デバイス内の画像を含む表です)。コードサンプル:

 // which image properties are we querying
 String[] projection = new String[] { BaseColumns._ID, ImageColumns.BUCKET_DISPLAY_NAME, ImageColumns.DATE_TAKEN, MediaColumns.TITLE, MediaColumns.DATA };

 // Get the base URI for the image table in the Contacts content provider.
 Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

 // Make the query.
 Cursor cur = context.managedQuery(images, projection, // Which columns to return
            "", // Which rows to return (all rows)
            null,//selection, // Selection arguments (none)
            ImageColumns.DATE_TAKEN + " DESC"// Ordering
            );
于 2013-04-22T09:04:16.137 に答える