0

別の場所にデータベース ファイルを作成しようとしていますが、アプリは常に作成できませんでした。

        try {
        File sdcardfile = Environment.getExternalStorageDirectory();
        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(sdcardfile.getPath()+ "/test.db", null);
        System.out.println("Its open? "  + db.isOpen());

    } catch (Exception e) {
        tv.setText("error is "+e.toString());// tv is a text view
    }

変更されたパスを使用しない限り、任意のデータベースを作成できます。「test.db」を使用すると正常に動作しますが、「//test.db」を使用するとうまくいきません。

これはlogcatテキストです:

01-21 20:14:19.470: I/Database(3678): sqlite returned: error code = 14, msg = cannot open file at source line 25467

それがスローするエラーは次のとおりですSQLite exception: unable to open database file. 。エミュレータとしてBlueStackを使用しています。

読んでくれてありがとう。

編集済み:書き込み許可がないため、アプリが失敗します...挿入すると、すべて問題ありません。

4

4 に答える 4

0

勝手な推測ですが (質問には情報がありません)、アプリのマニフェストで SD カードへのアクセス許可をリクエストしましたか?

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

于 2013-01-21T13:06:22.510 に答える
0

アプリの WRITE_EXTERNAL_STORAGE 権限を取得しましたか? DatabaseHelper でこれを使用すると、良い結果が得られました。

    public DatabaseHelper(final Context context) {
        super(context, Environment.getExternalStorageDirectory()
            + File.separator + FILE_DIR
            + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
    }
于 2013-01-21T13:06:52.213 に答える
0

より良い解決策は、SQLiteDatabaseOpenHelper を使用して、データベースをフォルダーに保存することです: /data/data/you.package.name/database 。これについては、こちらをご覧ください。お役に立てば幸いです

編集 :

これは簡単なコードです:

package com.radzik.mypersolnalnotepad;

import static com.radzik.mypersolnalnotepad.Stale.HASH;
import static com.radzik.mypersolnalnotepad.Stale.INT1;
import static com.radzik.mypersolnalnotepad.Stale.INT2;
import static com.radzik.mypersolnalnotepad.Stale.INT3;
import static com.radzik.mypersolnalnotepad.Stale.KIEDY;
import static com.radzik.mypersolnalnotepad.Stale.KTO;
import static com.radzik.mypersolnalnotepad.Stale.KTORY;
import static com.radzik.mypersolnalnotepad.Stale.LOGIN;
import static com.radzik.mypersolnalnotepad.Stale.NAZWA_TABELI1;
import static com.radzik.mypersolnalnotepad.Stale.NAZWA_TABELI2;
import static com.radzik.mypersolnalnotepad.Stale.NAZWA_TABELI3;
import static com.radzik.mypersolnalnotepad.Stale.TRESC;
import static com.radzik.mypersolnalnotepad.Stale.TYTUL;
import static com.radzik.mypersolnalnotepad.Stale.WANN;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Bazodanowiec extends SQLiteOpenHelper {

    public static final String NAZWA_BAZY = "database.db";
    public static final int WERSJA_BAZY = 1;

    public Bazodanowiec(Context kon)
    {
        super(kon, NAZWA_BAZY, null, WERSJA_BAZY );
    }

    public void onCreate(SQLiteDatabase bd)
    {
        bd.execSQL("CREATE TABLE IF NOT EXISTS " + NAZWA_TABELI1 + " (" + INT1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + LOGIN + " VARCHAR(60) NOT NULL, " + HASH + " VARCHAR(64) NOT NULL);");
        bd.execSQL("CREATE TABLE IF NOT EXISTS " + NAZWA_TABELI2 + " (" + INT2 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + TYTUL + " VARCHAR(60) NOT NULL, " + TRESC + " TEXT NOT NULL, " + KIEDY + " TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, " + KTO + " INTEGER NOT NULL, FOREIGN KEY(kto) REFERENCES konta(id1));");
        bd.execSQL("CREATE TABLE IF NOT EXISTS " + NAZWA_TABELI1 + " (" + INT3 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KTORY + " INTEGER NOT NULL, " + WANN + " TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY(ktory) REFERENCES konta(id1));");
    }


    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

      db.execSQL("DROP TABLE IF EXISTS " + NAZWA_TABELI1 + ";");
      db.execSQL("DROP TABLE IF EXISTS " + NAZWA_TABELI2 + ";");
      db.execSQL("DROP TABLE IF EXISTS " + NAZWA_TABELI3 + ";");
      onCreate(db);
    }

}

「古い」はインターフェースです。

于 2013-01-21T13:05:00.533 に答える
-1

この方法を試してください:

private static String DB_PATH;
public DataBaseHelper(Context p_context)
{
try
{
    m_context = p_context;
    if (DB_PATH == null)
    {
        DB_PATH = Environment.getExternalStorageDirectory()+ p_context.getApplicationContext().getPackageName() +File.separatorChar+ "databases" + File.separatorChar + "/test.db";
        }
        openOrCreateDatabase();
        m_dbhelper = new DBHelper(this.m_context, DB_PATH, null, DBConstant.DATABASE_VERSION);
    }
    catch (Exception e)
    {
    }
}
于 2013-01-21T13:45:34.257 に答える