Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android getWritableDatabase()未调用onCreate()_Android_Sqlite - Fatal编程技术网

Android getWritableDatabase()未调用onCreate()

Android getWritableDatabase()未调用onCreate(),android,sqlite,Android,Sqlite,我正在我的android应用程序中编写一个数据库,但是没有创建我的表。我在onCreate方法和getWriteableDatabase中添加了断点,并调用了getWriteableDatabase,但onCreate没有 package com.fslade.app; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQL

我正在我的android应用程序中编写一个数据库,但是没有创建我的表。我在onCreate方法和getWriteableDatabase中添加了断点,并调用了getWriteableDatabase,但onCreate没有

package com.fslade.app;

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

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "applicationdata";
    private static final int DATABASE_VERSION = 1;
    public static final String DATABASE_TABLE = "peopleT";

    // Database creation sql statement
    private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " (_id integer primary key autoincrement, "
            + "company_name text not null, name text not null, city text not null, vertical text not null, title text not null, email text not null, bio text not null, photo text not null, status text not null);";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Method is called during creation of the database
    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE);
    }

    // Method is called during an upgrade of the database, e.g. if you increase
    // the database version
    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion,
            int newVersion) {
        Log.w(DatabaseHelper.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        database.execSQL("DROP TABLE IF EXISTS todo");
        onCreate(database);
    }
}
在我的数据库助手中,我调用getWriteableDatabse():


创建只发生一次(这就是数据库助手的全部含义)

您是否检查了数据库是否已创建?它位于
/data/data/your.package.name/databases/dbname


如果在android应用程序设置中清除应用程序数据,则应再次调用您的
onCreate

SQLiteOpenHelper.onCreate()
SQLiteOpenHelper.getWritableDatabase()
(或
SQLiteOpenHelper.getReadableDatabase()
之后调用)仅当数据库不存在于应用程序的持久存储(即SD卡)中时。换句话说,
onCreate()
只被调用一次,如果代码成功地创建了一个存储在持久存储中的数据库。如果数据库存在于持久性存储中,但您正在更改其架构

您使用的是
SQLiteOpenHelper.onUpgrade()
,当您按名称打开一个数据库时,它会被调用,但版本号以前从未使用过。您可以在其中删除旧的模式对象,然后在其中调用
SQLiteOpenHelper.onCreate()
来创建新的模式。如果您希望在数据库打开时运行代码(SQLiteOpenHelper.get[Writable,Readable]database()调用的代码),请实现
onOpen()
。然后调用一个初始化数据库(或针对数据库初始化的代码)的方法,该方法是从
SQLiteOpenHelper.onCreate()
SQLiteOpenHelper.onOpen()调用的

例如,您可能希望使用对
SQLiteDatabase
的引用,根据该引用调用数据管理方法,如
SQLiteDatabase.execSQL()

在每个

SQLiteOpenHelper.onCreate(SQLiteDatabase db)

打电话给

void initDB(SQLiteDatabase db)
{
    this.db = db;
}

当Android多任务处理您的进程时,您应该处理代码中回调处理程序的其他对象生命周期事件。但至少您的数据库处理代码必须处理
SQLiteOpenHelper.onCreate()
SQLiteOpenHelper.onOpen()

我也有同样的问题。我为2个解决方案提供资金

  • 重新启动仿真器并选中“擦除用户数据” 我的模拟器重启缓慢,所以
  • 更改数据库的版本号,它再次调用“OnCreate”,并为我提供了数据库的当前版本。我丢失了存储的信息(没什么大不了的)

  • 祝你好运

    这是一个相当愚蠢的实现限制。:-)确保数据库名称具有
    .db
    扩展名<如果没有扩展名,则不会调用code>onCreate()

    我也遇到了同样的问题。我忘记了我的sql_Create字符串中两个sql命令之间的空格,因此我需要的列没有正确实现,但是当我发现并修复字符串中的错误时,它没有修复问题,因为应用程序已经将该数据库注册为具有该表。所以从来没有调用过onCreate。对我来说,最简单的解决方案是更新版本号。这创建了一个新的数据库和表(正确),并修复了应用程序

    这正是问题所在。我在开发的早期已经运行过onCreate,但是使用了一个格式错误的sqlcreate命令。如何清除Eclipse中的应用程序设置?我不明白您为什么要在Eclipse中执行此操作,因为它只是您的代码,所以没有任何更改。如果您想从设备中删除现有应用程序数据,请转到
    Android设置>应用程序>管理应用程序>您的应用程序>删除数据
    (如果名称不匹配,很抱歉,我的菜单是德语的),以防您不想删除所有应用程序数据(例如,如果有其他工作正常的数据库,您不想删除)我建议通过Android调试监视器进入并删除有问题的SQLite数据库文件。当我处于此位置时,这对我来说非常有吸引力。最好使用context.getDatabasePath(DB_NAME).toString()而不是硬编码路径哇…太感谢了!这让我发疯了!…真是太愚蠢了!甚至在Android文档中都没有。他们的示例中没有。哇哦,太多了!这件事让我发疯了!+1哥们,你可能是重复的
    SQLiteOpenHelper.onOpen(SQLiteDatabase db)
    
    void initDB(SQLiteDatabase db)
    {
        this.db = db;
    }