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

更好的解决方案是将数据库保存在文件夹中:/data/data/you.package.name/database,使用 SQLiteDatabaseOpenHelper。阅读这里。我希望我有所帮助

编辑 :

这是简单的代码:

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 回答
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 回答
-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 回答