Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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
Java 数据库被覆盖(必须打开应用程序两次才能正确显示)?_Java_Android - Fatal编程技术网

Java 数据库被覆盖(必须打开应用程序两次才能正确显示)?

Java 数据库被覆盖(必须打开应用程序两次才能正确显示)?,java,android,Java,Android,最新:检查底部的代码以了解我的黑客解决方案 原创:我遵循了一些教程和示例,制作了自己的数据库。问题是,当我将数据库下载到手机上时,它应该被读取并填充到旋转器中。。我发现下载的数据库是完整的,但当dbhelper读取它时,它会以某种方式被重写到一个空白表中。我不明白为什么 编辑1: 对不起,我应该说得更清楚些。数据库来自服务器。它直接下载到/data/data/project/databases/。那是我下载文件后检查的地方。在我调用“DbAdapter mDbHelper=newdbadapte

最新:检查底部的代码以了解我的黑客解决方案

原创:我遵循了一些教程和示例,制作了自己的数据库。问题是,当我将数据库下载到手机上时,它应该被读取并填充到旋转器中。。我发现下载的数据库是完整的,但当dbhelper读取它时,它会以某种方式被重写到一个空白表中。我不明白为什么

编辑1:
对不起,我应该说得更清楚些。数据库来自服务器。它直接下载到/data/data/project/databases/。那是我下载文件后检查的地方。在我调用“DbAdapter mDbHelper=newdbadapter(context)”之前,它一直很好;mDbHelper.open(“名称”);'在此之后,Android元数据表、名称表和sqlite表仍在数据库中,列有名称,但没有条目,因此该表基本上是空白的

编辑2:(抱歉这么长时间)

我在下面的评论中作出了回应:

c = initSpinner(c);
这是我写的一个方法,以防光标返回!moveToFirst()。在此方法中,创建数据库并将“添加名称”插入表中

然后我玩了一下应用程序,我发现:

当我第一次在我的设备上打开应用程序时,在一个干净的安装中,微调器显示默认的“添加名称”。所以我加了一个名字。。我重新打开应用程序,我输入的名称与“添加名称”一起出现在那里。。。清除所有数据并卸载后转到emulator。。打开应用程序,只显示“添加名称”。。退出并重新打开,微调器有“添加名称”和我在手机上输入的名称。。。所以我在模拟器上添加了一个名字,回到我的手机,关闭并重新打开应用程序,现在有两个名字和“添加名字”

小结:它可以工作,但我必须在初始安装后重新打开应用程序才能读取db并正确填充微调器。为什么?

EDIT3(最新版本):有关黑客解决方案,请参见末尾的代码

下面是填充微调器的代码

    private void fillSpinner(){

    DbAdapter mDbHelper = new DbAdapter(context);
    mDbHelper.open("names");

    Cursor c = mDbHelper.fetchAllRows();
    ArrayList<String> a = new ArrayList<String>();

    if ( c.getPosition() != 0 && c.moveToFirst() == (false) ){
//          c = initSpinner(c); //commented out to prevent creating a new     //database.
    }
} }

---黑客代码:

    private void fillSpinner(){

    DbAdapter mDbHelper = new DbAdapter(context);
    mDbHelper.open("name");
        mDbHelper.createRow("Add Name"); //added this
    mDbHelper.close();               //added this
    downloadFile();                  //added this
    mDbHelper.open("names");

    Cursor c = mDbHelper.fetchAllRows();
    ArrayList<String> a = new ArrayList<String>();

    if ( c.getPosition() != 0 && c.moveToFirst() == (false) ){
        c.close();          

        mDbHelper.createRow("Add Name");
        c = mDbHelper.fetchColumns(new String[] {"_id","name"});
    }
private void fillSpinner(){
DbAdapter mDbHelper=新的DbAdapter(上下文);
mDbHelper.open(“名称”);
mDbHelper.createRow(“添加名称”);//添加了这个
mDbHelper.close();//添加了此
downloadFile();//添加了这个
mDbHelper.open(“名称”);
游标c=mDbHelper.fetchAllRows();
ArrayList a=新的ArrayList();
如果(c.getPosition()!=0和c.moveToFirst()==(false)){
c、 close();
mDbHelper.createRow(“添加名称”);
c=mDbHelper.fetchColumns(新字符串[]{“\u id”,“name”});
}
你说的“当我将数据库下载到手机上时”是什么意思?我猜你在资产中包含了数据库?如果是这样的话

SQLiteOpenHelper
在应用程序专用内部存储中查找数据库。它找不到数据库,因此将在内部存储中创建一个新的数据库。该数据库随后将从中读取

我脑子里有几个选择:

  • DbHelper
    onCreate中创建并填充数据库(而不是像现在这样创建一个空数据库)。如果它是一个小的简单数据库,我会这样做
  • 从资产复制到内部存储。示例

  • 这是我发现的一个黑客/变通方法,但为什么它会起作用

    private void fillSpinner(){
    
    DbAdapter mDbHelper = new DbAdapter(context);
    mDbHelper.open("name");
        mDbHelper.createRow("Add Name"); //added this
    mDbHelper.close();               //added this
    downloadFile();                  //added this
    mDbHelper.open("names");
    
    Cursor c = mDbHelper.fetchAllRows();
    ArrayList<String> a = new ArrayList<String>();
    
    if ( c.getPosition() != 0 && c.moveToFirst() == (false) ){
        c.close();          
    
        mDbHelper.createRow("Add Name");
        c = mDbHelper.fetchColumns(new String[] {"_id","name"});
    }
    
    private void fillSpinner(){
    DbAdapter mDbHelper=新的DbAdapter(上下文);
    mDbHelper.open(“名称”);
    mDbHelper.createRow(“添加名称”);//添加了这个
    mDbHelper.close();//添加了此
    downloadFile();//添加了这个
    mDbHelper.open(“名称”);
    游标c=mDbHelper.fetchAllRows();
    ArrayList a=新的ArrayList();
    如果(c.getPosition()!=0和c.moveToFirst()==(false)){
    c、 close();
    mDbHelper.createRow(“添加名称”);
    c=mDbHelper.fetchColumns(新字符串[]{“\u id”,“name”});
    }
    
    对不起,我应该说得更清楚一些。数据库来自服务器。它直接下载到/data/data/project/databases/。下载后我在那里检查了文件。在我调用'DbAdapter mDbHelper=new DbAdapter(context);mDbHelper.open(“名称”)之前,它一直很好'之后,Android元数据表、名称表和sqlite表仍在数据库中,列有名称,但没有条目,因此表基本上是空的。我假设主键字段也已命名为_id?在这种情况下,我的想法数量有限。它们命名为_id,是的。不知何故,当我调用db打开并开始读取它会创建一个新的数据库,其中有一个空表。在这个过程中,
    onUpgrade
    是否被调用过?这似乎是代码中唯一一个可以显式删除数据库中的记录并重新创建表的地方,因此它似乎是一个可疑的地方。我很确定,自从db版本在上没有改变..检查黑客代码,我让它工作了.仍然不明白为什么。。
        private void fillSpinner(){
    
        DbAdapter mDbHelper = new DbAdapter(context);
        mDbHelper.open("name");
            mDbHelper.createRow("Add Name"); //added this
        mDbHelper.close();               //added this
        downloadFile();                  //added this
        mDbHelper.open("names");
    
        Cursor c = mDbHelper.fetchAllRows();
        ArrayList<String> a = new ArrayList<String>();
    
        if ( c.getPosition() != 0 && c.moveToFirst() == (false) ){
            c.close();          
    
            mDbHelper.createRow("Add Name");
            c = mDbHelper.fetchColumns(new String[] {"_id","name"});
        }
    
    private void fillSpinner(){
    
    DbAdapter mDbHelper = new DbAdapter(context);
    mDbHelper.open("name");
        mDbHelper.createRow("Add Name"); //added this
    mDbHelper.close();               //added this
    downloadFile();                  //added this
    mDbHelper.open("names");
    
    Cursor c = mDbHelper.fetchAllRows();
    ArrayList<String> a = new ArrayList<String>();
    
    if ( c.getPosition() != 0 && c.moveToFirst() == (false) ){
        c.close();          
    
        mDbHelper.createRow("Add Name");
        c = mDbHelper.fetchColumns(new String[] {"_id","name"});
    }