Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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 如何使用预先填写的表格发送应用程序?_Android_Database_Sqlite_Copy - Fatal编程技术网

Android 如何使用预先填写的表格发送应用程序?

Android 如何使用预先填写的表格发送应用程序?,android,database,sqlite,copy,Android,Database,Sqlite,Copy,我正在开发一个应用程序,其中我创建了一个包含多个表的数据库: public class Database extends SQLiteOpenHelper { private static final String DB_NAME = "db"; private static final int DB_VERSION = 1; public Database(Context context) { super(context,DB_NAME, null,

我正在开发一个应用程序,其中我创建了一个包含多个表的数据库:

public class Database extends SQLiteOpenHelper {
    private static final String DB_NAME = "db";
    private static final int DB_VERSION = 1;

    public Database(Context context) {
        super(context,DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String table = "CREATE TABLE users(";
        table += "_id TEXT PRIMARY KEY,";
        table += "cat TEXT NOT NULL,";
        table += "city TEXT NOT NULL,";
        table += "country TEXT NOT NULL,";
        table += "addr TEXT,";

        String table2 = "CREATE TABLE special(";
        table2 += "idspec TEXT PRIMARY KEY);";

        String table3 = "CREATE TABLE places(";
        table3 += "id TEXT PRIMARY KEY,";
        table3 += "text TEXT NOT NULL,";
        table3 += "data TEXT NOT NULL,";
        table3 += "user TEXT REFERENCES users(_id));";

        String table4 = "CREATE TABLE average(";
        table4 += "user TEXT PRIMARY KEY,";
        table4 += "place INTEGER NOT NULL,";
        table4 += "avg REAL NOT NULL);";

        db.execSQL(table);
        db.execSQL(table2);
        db.execSQL(table3);
        db.execSQL(table4);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}
我想再添加一个表,其中包含大约70个条目,我将在其他类中阅读这些条目。那么,如何添加预填充表呢?
也许,有一种最好的方法可以达到同样的目的,如果我不知道的话,很抱歉。

您可以使用SQLiteAssetPer为您的应用程序提供预填充的数据,这里是存储库的链接 在您的应用程序中,只需调用构造函数即可

public Yourclassname(Context context) 
{
super(context,Database_Name,null, Database_Version);
}
在onCreate()方法中,只需检查是否没有记录

即:执行如下查询:

SELECT * FROM users
并检查记录计数是否为0

int count = cur.getCount();
如果计数为0,则在事务下执行插入。
注意:我将上下文传递给我的函数,我称之为
ctx

这是功能的核心部分

    SQLiteDatabase db = null;
    try
    {
        db = ctx.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
        // Start the transaction
        db.beginTransaction();

        // Fill the table
        db.execSQL("INSERT INTO users () values ()");
        // ... more inserts...

        db.setTransactionSuccessful();
    }
    catch (final SQLiteException se)
    {
        System.out.println
        (
            ctx.getClass().getSimpleName() + "\n" +
                "Could not import to the database"
        );
        se.printStackTrace();
        result = 0;
    }
    finally
    {
        // End the transaction
        db.endTransaction();
        db.close();
    }
[编辑]

然后我读到:
我想添加更多的表


这(更改现有数据库结构)必须在
onUpgrade()
方法中完成,将database\u VERSION常量设置为更高的值(以便启动
onUpgrade()
方法)。

我不需要在资产文件夹中添加完整的数据库,只需预先填充数据库的一个表,它不是重复的。我在发布之前搜索过,没有人问过要发布一个带有预填充表格的android应用程序。我在应用程序启动时创建数据库,所以我不需要捆绑数据库,我只想在同一数据库的一个表中填充一些数据。非常简单,然后:在
onCreate()
方法中,只需检查是否没有记录。然后在事务下执行插入。我相信这是正确的方法。你能用一个例子添加一个答案吗?好的,看看我的答案。重命名你的DB_版本常量:应用程序还没有发布。。。为什么我不能在onCreate()方法中添加这个预先填充的表?好吧,只要不考虑编辑部分,您就可以了。我加了一句“我想加一张桌子”。只需从
/data/data/…
路径中删除数据库,然后重新运行app.Ehm。。。我是否必须在SQLiteOpenHelper类中创建一个新方法(使用您的代码)?不一定。不过我还是建议了。我将其称为
preFillTable(Context ctx,String tableName){…}
我遇到了一些问题,因为我使用了一个异步任务来填充其他表。所以我不得不在AsyncTask中添加您的方法,现在它可以工作了。谢谢你的大力支持。