为什么我的SQLite数据库没有创建/保存到磁盘?

时间:2014-04-07 16:48:59

标签: android-emulator android-studio android-sqlite virtualization sqliteopenhelper

我创建了基于文章here创建SQLite数据库的代码。

最相关的代码是:

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "Platypus.db";
private static final String TABLE_VENDORS = "vendors";

public static final String COLUMN_ID = "_id";
public static final String COLUMN_VENDORID = "vendorId";
public static final String COLUMN_COMPANYNAME = "companyName";

public SQLiteHandlerVendors(Context context, String vendor,
                            SQLiteDatabase.CursorFactory factory, int company) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_VENDORS_TABLE = "CREATE TABLE " +
            TABLE_VENDORS + "("
            + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_VENDORID
            + " TEXT," + COLUMN_COMPANYNAME + " TEXT" + ")";
    db.execSQL(CREATE_VENDORS_TABLE);
}

public void addVendor(Vendor vendor) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_VENDORID, vendor.getVendorId());
    values.put(COLUMN_COMPANYNAME, vendor.getCompanyName());

    SQLiteDatabase db = this.getWritableDatabase();

    db.insert(TABLE_VENDORS, null, values);
    db.close();
}

然而,尽管数据的插入似乎有效 - 但addVendor()的调用在没有任何异常的情况下运行时使用以下代码:

protected void onPostExecute(String result) {
    try {
        JSONArray jsonArr = new JSONArray(result);
        for (int i = 0; i < jsonArr.length(); i++) {
            JSONObject jsonObj = jsonArr.getJSONObject(i);
            String vendorId = jsonObj.getString("vendorId");
            String companyName = jsonObj.getString("companyName");
            Log.i("vendorId", vendorId);
            Log.i("companyName", companyName);
            // Prepare for writing to db
            Vendor vend = new Vendor();
            vend.setVendorId(vendorId);
            vend.setCompanyName(companyName);
            SQLiteHandlerVendors sqliteHandler = new SQLiteHandlerVendors(MainActivity.this, null, null, 1);
            sqliteHandler.addVendor(vend);
        }
    } catch (JSONException j) {
        System.out.println(j.getMessage());
        Log.i("jsonEx", j.getMessage());
    }
    Log.i("GetVendorsTask.FromOnPostExecute", result);
}

我找不到应该创建的 Platypus.db 文件。

This article说,“如果你的应用程序创建了一个数据库,那么这个数据库默认保存在目录DATA / data / APP_NAME / databases / FILENAME 中。”

在我的硬盘上全局搜索“Platypus.DB”没有任何结果。创建的数据库是不是持久存在,还是有其他原因导致我找不到它?

我尝试通过添加此代码找到它:

Log.i("Data Dir", Environment.getDataDirectory().toString());

......当LogCat给我的时候是:

04-07 12:36:47.133    1089-1089/platypus.app I/Data Dir﹕ /data

C:\ Users \ clay \ AndroidStudioProjects \ Platypus 中没有“data”文件夹,我的硬盘根目录中也没有(* C:*)。

数据目录/文件是否只能在某个虚拟空间,模拟器的文件系统中查看?如果是这样,我如何实际访问模拟器的文件系统以查看此数据?

更新

好的,我打开了这个视图,并导航到数据/数据/ hhs(应用程序的名称真的是“hhs”而非“platypus”):

enter image description here

...但仍然没有看到HHS.DB(我看不到所有的“数据库”文件夹)......

更新2

如果我选中“&lt; =”按钮(“从设备中提取文件”)并突出显示大小为16384的文件, 将打开“获取设备文件”对话框文件名为“HHS.DB”(正如我希望找到的那样)。

但是,为什么它的路径是“data \ data \ hhs \ unnamed folder \ unnamed file”而不是“data \ data \ hhs \ databases \ HHS.DB”?

另一个文件(大小8720)是HHS.db-journal

更新3

将这些文件保存到我的硬盘并下载SQLite Data Browser后,我能够验证记录是否实际写入表中:

enter image description here

SQLite数据浏览器是满足这种需求的绝佳工具!

更新4

我不知道改变了什么/它如何改变,但它现在正在按原样运作:

enter image description here

1 个答案:

答案 0 :(得分:2)

  

中没有“data”文件夹   C:\ Users \ clay \ AndroidStudioProjects \ Platypus,也没有   我的硬盘根目录( C:)。

是的,这是核心。

  

数据目录/文件是否只能在文件中的某个虚拟空间中查看   仿真器的系统还是这样?如果是这样,我怎么才能真正访问   模拟器的文件系统来查看这些数据?

使用Eclipse,您可以从模拟器中提取数据库

转到windows打开透视图。转到DDMS

然后转到文件资源管理器 - &gt; data-&gt; data-&gt;查看您的包名 - &gt;数据库 - &GT; Platypus.DB“

/data/data/[packagename]/databases/

您选择数据库并且有一个选项来提取数据库,然后您可以使用sqlite浏览器来查看数据