0

assets フォルダーに sqlite ファイルがあります。他のスタック オーバーフローの投稿で何千回も参照されているデータベース マネージャー クラスを使用しています: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

private void copyDatabase() throws IOException {
        // Open your local db as the input stream
        InputStream myInput = context.getAssets().open( DB_NAME );

問題は、IOException をスローし続ける open() メソッド (または getAssets?) です。私のパスとファイル名:

private static final String DB_NAME = "attractioninfo";
private static final String DB_PATH = "/data/data/seattle.tourists/";

私が持っている別の関連する質問は、パスに関するものです。テスト用の電話 (samsung galaxy sII) でファイルを確認しましたが、/data/data/mypackagename/... がどこにもありません。これは正確には内部ストレージのどこにありますか? 私はAndroid 2.2を使用しています。

編集:さらにテストを行ったところ、最初のインストール時に(これは、電話の内部ストレージにデータベースファイルがまだないことを意味し、そこにコピーする必要があることを意味します)、この行も機能しません(私はSQLiteException)

private boolean checkDatabase() {
    SQLiteDatabase checkDB = null;

    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase( myPath, null, SQLiteDatabase.OPEN_READONLY );

完全なコード:

package seattle.tourists;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.content.res.AssetManager;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "attractioninfo";
    private static final String DB_PATH = "/data/data/seattle.tourists/databases/";
    private static final int DB_VERSION = 1;
    private static final String TABLE_NAME = "ExtraInfo";

    private SQLiteDatabase db;
    private final Context context;

    /**
     * Constructor
     * @param context application context
     */
    public DatabaseHelper( Context context ) {
        super( context, DB_NAME, null, DB_VERSION );
        this.context = context;
    }

    /**
     * Creates empty database on system and rewrites it with existing database
     * @throws IOException
     */
    public void createDatabase() throws IOException {
        boolean dbExist = checkDatabase();

        if ( dbExist ) {
            // do nothing, the database already exists;
        }
        else {
            this.getReadableDatabase();

            try {
                copyDatabase();
            }
            catch ( IOException e ) {
                throw new Error( "Error copying database" );
            }
        }
    }

    /**
     * Check to see if a database exists
     * @return true if database exists, false otherwise;
     */
    private boolean checkDatabase() {
        SQLiteDatabase checkDB = null;

        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase( myPath, null, SQLiteDatabase.OPEN_READONLY );
        }
        catch ( SQLiteException e ) {
            int x = 5;
        }

        if ( checkDB != null )
            checkDB.close();

        return checkDB != null ? true : false;
    }

    /**
     * Copes database from assets-folder to system folder, where it can be
     * accessed and handled. This is done by transferring byte-stream.
     * @throws IOException
     */
    private void copyDatabase() throws IOException {
        // Open your local db as the input stream
        AssetManager assets = context.getAssets();
        InputStream myInput = assets.open( DB_NAME );

        String outFileName = DB_PATH + DB_NAME;

        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream( outFileName );

        // transfer bytes from the inputfile to the outputfile
        byte [] buffer = new byte[ 1024 ];
        int length;
        while ( ( length = myInput.read( buffer ) ) > 0 )
            myOutput.write( buffer, 0, length );

        // close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public SQLiteDatabase openDataBase() throws SQLException {
        // Open the database
        String myPath = DB_PATH + DB_NAME;
        return db = SQLiteDatabase.openDatabase( myPath, null, SQLiteDatabase.OPEN_READONLY );
    }

    public synchronized void close() {
        if ( db != null )
            db.close();

        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // do nothing
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // do nothing
    }
}
4

3 に答える 3

0

あなたのパスで:

private static final String DB_PATH = "/data/data/seattle.tourists/";


欠落しているディレクトリがあります wc は、パッケージ名の後の「/database/」です。

于 2013-02-16T19:02:51.717 に答える
0

間違ったファイル形式を使用していたことがわかりました。sqlite ではなく、txt/SQL 形式を使用していました。

于 2012-08-29T00:27:14.867 に答える
-1

Assets の使用からデータベースを開くには

AssetManager am = myContext.getAssets();
InputStream is = am.open("DB Name");

Another related question I have is about the path. I've checked the files on my testing phone (samsung galaxy sII) but I don't see a /data/data/mypackagename/..

セキュリティ上の理由により、デバイスで DB を表示することはできません。実際にDBを見たい場合。次に、エミュレーターにアプリをインストールする必要があります

編集:

データベースをコピーするコード

 private static String db_path = "/data/data/your.package.name/databases/";
 private static final String database_name = "search";

 private void copyDataBase() throws IOException {

    String outFileName = db_path + database_name+".db";
    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);
    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int i, r;
    AssetManager am = myContext.getAssets();
    String fn = String.format(database_name);
        InputStream is = am.open(fn);
    while ((r = is.read(buffer)) != -1)
       myOutput.write(buffer, 0, r);
        is.close();

    // Close the streams
    myOutput.flush();
    myOutput.close();

}

DBを調べる

private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = db_path + database_name+".db";

        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    } catch (SQLiteException e) {
        // database does't exist yet.
    }
    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;
}

追加したことを確認してください

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

あなたの中にmanifest file

于 2012-08-27T04:56:53.377 に答える