【问题标题】:android database returning no records but sqlitebrowser contains dataandroid 数据库不返回记录但 sqlitebrowser 包含数据
【发布时间】:2012-06-09 08:45:39
【问题描述】:

我有一个数据库文件没有被读取的问题 我已经在名为 mydb 的资产中添加了数据库文件,但是当我运行我的代码时,它说它没有被定位。它正在调用这个 toast Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show();之所以调用它,是因为没有返回任何记录。我也知道它正在查找文件,因为没有 FileNotFoundException 异常。这是一个示例形式的 Android 应用程序开发书籍。

public class DatabaseActivity extends Activity {
    /** Called when the activity is first created. */
    TextView quest, response1, response2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView quest = (TextView) findViewById(R.id.quest);


        try {           
            String destPath = "/data/data/" + getPackageName() + "/databases/MyDB";
            File f = new File(destPath);            
            if (!f.exists()) {          
                CopyDB( getBaseContext().getAssets().open("mydb"), 
                    new FileOutputStream(destPath));
            }
        } catch (FileNotFoundException e) {         
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        DBAdapter db = new DBAdapter(this); 


        //---get a contact---
        db.open();
        Cursor c = db.getContact(2);
        if (c.moveToFirst())        
            DisplayContact(c);
        else
            Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show();
        db.close();



    }

    public void CopyDB(InputStream inputStream, OutputStream outputStream) 
    throws IOException {
        //---copy 1K bytes at a time---
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
        inputStream.close();
        outputStream.close();
    }

    public void DisplayContact(Cursor c)
    {
    quest.setText(String.valueOf(c.getString(1)));      
        //quest.setText(String.valueOf("this is a text string"));    
    } 
}

有没有更好的上传数据的方法。

【问题讨论】:

    标签: android sqlite android-assets


    【解决方案1】:

    这里想到了一些事情......

    1. 由于!f.exists() 检查,一旦数据库存在(并且可能为空),它将永远不会再复制它。所以也许现在,一直复制它,直到你解决问题然后添加!f.exists()

    2. 我使用 e.printStackTrace() 得到的结果好坏参半,可能更改为 Log.e(TAG, "message", e),看看您是否开始看到 LogCat 中出现错误

    至于更好的方法...我已经用几种不同的方式做到了... 1.就是创建一个文件(json,cvs等)然后处理加载,如果数据库是空的 2.和第一个类似,只是我创建了一个java序列化对象数组,如果数据库是空的,将其加载到数据库中。

    我也不知道DBAdapter 长什么样子,因为它包装了数据库,所以问题可能就在那里。

    【讨论】:

    • 谢谢,我会试一试。我不认为它是 DBAdapter,因为我在其他示例中使用了它,它运行良好。我刚刚在将 db 文件添加到资产并读取它时遇到了问题。它上传很好。数据似乎没有被读入游标,因此可以输出到 xml 布局文件。
    • 但是,DBAdapter 打开的位置与String destPath = "/data/data/" + getPackageName() + "/databases/MyDB"; 完全相同吗? (文件名也一样,等等)。也许,您正在将资源数据库复制到不同的文件?
    • 这是我修复的表的名称,该表称为 basic_table,这似乎不起作用。所以我删除了取消标记。我还听取了您关于不使用 printStackTrace() 的建议。还要感谢您对 !if.exists() 语句的建议
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多