android / sqlite:无法在更改的路径中创建数据库

时间:2013-01-21 13:01:09

标签: android

我正在尝试在其他位置创建数据库文件,但该应用始终未能这样做。

        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 ...插入它并且一切正常。

4 个答案:

答案 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)
    {
    }
}