SQLite数据库未创建。

8
我正在使用我从流行的记事本示例中学到的标准方法来构建我的第一个应用程序。
但是我遇到了一个奇怪的问题。
SQLite数据库文件(.db)没有被创建在/data/data/package/databases中。我已经交叉检查了清单文件和OpenHelper文件,参考了HeadFirst android dev. Book(我使用它作为参考),但我发现自己无法弄清楚为什么数据库文件没有被创建..
是否需要特殊权限或者我们需要打开某些东西才能使其正常工作??
奇怪的是,预加载的示例可以正常工作。这意味着记事本示例的'.db'文件已经被创建,但是当我尝试时,它失败了。:(
以下是我的文件。

包 - database.test

1. AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk android:minSdkVersion="10" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".Database_testActivity"
        android:label="@string/app_name" >
    </activity>
</application>

2.TestOpenHelper.java

package database.test;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class TestOpenHelper extends SQLiteOpenHelper {

TestOpenHelper(Context context){
    super(context,"mydb.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase database){
    database.execSQL("create table test_1 " + " (field1 integer primary key, field2 integer);");
}
public void onUpgrade (SQLiteDatabase database, int oldVersion, int newVersion){
    database.execSQL("drop table if exists test1");
    onCreate(database);
}
}

3.Database_testActivity.java

package database.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class Database_testActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ListView listview = (ListView)findViewById(R.id.test_list);
    TestAdapter ta = new TestAdapter();
    listview.setAdapter(ta);

    TestOpenHelper openHelper = new TestOpenHelper(this);
}
}   

我知道这是一个非常基础的问题,但我已经尝试解决了15天,现在我完全感到沮丧。
请帮忙。。


1
你应该在各个地方使用 Log 并监视 logcat 来跟踪发生的情况。另外,我可能错了,但你尝试在 TestOpenHelper 构造函数中使用 "mydb" 作为数据库名称了吗?正如我所说,我可能错了,但我无法避免地感觉使用文件扩展名(例如 "mydb.db")可能会引起问题。 - Squonk
你能解释一下使用Log吗?我尝试了各种名称,但什么都没有发生。谢谢。 - Bond
每个应用程序在/data/data目录下都以com.android.something开头,但我的应用程序不是这样的。这可能是我的问题的原因吗? - Bond
将类似 Log.d("MyAppName", "In TestOpenHelper constructor"); 的内容输入。 - Squonk
1个回答

24

改为:

database.execSQL("create table test_1 " + " (field1 integer primary key, field2 integer)");

将这个 TestOpenHelper openHelper = new TestOpenHelper(this); 改为 SQLiteDatabase db = new TestOpenHelper(this).getWritableDatabase();

你实际上没有创建数据库,你只是创建了一个 SQLiteOpenHelper 的实例,但是要创建或打开数据库,你必须使用 getWritableDatabase()getReadableDatabase() 方法。

正如文档所述:

创建和/或打开一个用于读取和写入的数据库。


你的代码没有起作用,因为你从未创建数据库,你只是创建了SQLiteOpenHelper的实例 :-) 要创建数据库,你必须调用 getWritableDatabase()getReadableDatabase() 方法,这些方法将创建/打开你的数据库。当你的数据库已经被创建时,这些方法将始终只能打开你的数据库。 - Simon Dorociak
@MisterSquonk,有时候就会发生这种情况 :-) - Simon Dorociak
hawaii.five-0 和 @MisterSquonk:我还想问一件事。 /data/data 中的每个应用程序都以com.android.something开头,但我的应用程序不是这样。我该如何将我的应用程序放入标准文件夹中呢? - Bond
你应该创建包 com.android.bond.myCustomDatabase。 - Simon Dorociak
每个应用程序都需要这样命名吗?谢谢帮助新手。 - Bond
@bond: 你的程序包名称应该是独特的,属于你自己或公司。如果你没有注册域名,那么可以使用像 com.example.mypackage.myapp 这样的命名。参考我关于“通用”包名的提问所得到的答案https://dev59.com/31_Va4cB1Zd3GeqPSE5M。我有域名,所以我的程序包命名以`com.mydomain.mypackage.`开头。你不应该使用`com.android`,因为`android.com`是一个已经注册的域名。 - Squonk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接