我正在尝试在其他位置创建数据库文件,但该应用始终未能这样做。
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作为我的模拟器。
谢谢大家的阅读。
编辑:我的应用程序失败,因为它缺少WRITE PERMISSION ...插入它并且一切正常。
答案 0 :(得分:0)
更好的解决方案是使用SQLiteDatabaseOpenHelper将数据库保存在文件夹:/data/data/you.package.name/database中。阅读此HERE。我希望我帮助
编辑:
这是一个简单的代码:
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);
}
}
“陈旧”是界面。
答案 1 :(得分:0)
狂野猜测(问题中缺少信息),但是您是否已获得访问应用清单中SD卡的权限?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 2 :(得分: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);
}
答案 3 :(得分:-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) { } }