0

我只想创建一个简单的数据库,一个包含两列的表:id,它将自动递增和数据,因此要存储我的目标数据。我创建了这段代码,它不返回任何错误但也不添加任何数据:

database = openOrCreateDatabase ("alldata", 0, null);
    try{
        database.execSQL("CREATE TABLE cars(_id INTEGER PRIMARY KEY,data INTEGER);");
    }
    catch(SQLException e){

    }

    //database.execSQL("INSERT INTO cars(data) values(0);");
    database.execSQL("INSERT INTO cars(data) values(1);");
    database.execSQL("INSERT INTO cars(data) values(2);");
    database.execSQL("INSERT INTO cars(data) values(3);");
    database.execSQL("INSERT INTO cars(data) values(4);");
    database.execSQL("INSERT INTO cars(data) values(5);");

    String[] data={"_id","data"};
    Cursor c=database.query(false, "cars", data, null, null, null, null, null, null, null);
    int i=0;
    if(c.getCount()>0){
        c.moveToFirst();
        readed[i]=c.getInt(0);
        readed[i+1]=c.getInt(1);
        i+=2;
    }

当我尝试阅读“已读”表时,它只显示两个零 00:

            for(int i=0;i<readed.length;i++){
                if(readed[i] != null)
                    draw_number((int) readed[i],canvas,(float)(0.9*width-i*0.05*width),(float)(0.8*height));
            }

Draw number 是我在surfaceview上绘制数字的方法,这个没有问题。但不幸的是我不知道,数据库的问题在哪里。据我所知,我一切正常,它应该返回:0 0 1 1 2 2 3 3 4 4 5 5(因为之前我在数据列中添加了一个 0。)但它只返回 0 0 有什么想法吗?

4

3 回答 3

0

你还没有为你的数据库使用自动增量。?从您的数据库中可以看出

这就是你只得到 1 个结果的原因。

使用 drop table 并重试

改变

       for(int i=0;i<readed.length;i++){

      for(int i=0;i<readed[].length;i++){
于 2013-05-25T12:45:12.713 回答
0

您可以使用“管理应用程序”->“清除数据”清除应用程序数据(这将删除所有以前创建的数据库、首选项和所有这些东西)。并再次使用 AUTOINCREMENT 执行代码。

database.execSQL("CREATE TABLE cars(_id INTEGER PRIMARY KEY AUTOINCREMENT,data INTEGER);");
于 2013-05-25T12:51:06.187 回答
0

代码的行为似乎与编写的完全一样。

首先,您有一些代码可以检查结果中是否存在一行。然后它继续读取第一个结果,并且只读取第一个结果(也许你误认为if?while但在这种情况下你moveToFirst错了,即使你切换if为 awhile它只会一次又一次地读取第一行)并放置它进入readed数组。

由于readed仅包含第一行中的数字,因此第二个片段将遍历整个数组,但仅打印前两个数字(不为空的值)。这正是您报告的结果。

也许您想编写一个将所有游标行加载到的代码readed?这将是一个循环(不是条件语句):

while (c.hasNext()) {
   c.moveToNext();
   readed[i] = c.getInt(0);
   readed[i+1] = c.getInt(1);
   i += 2;
}

吞下例外是对每个回答你问题的人的冒犯和侮辱。

在这行代码中可以看到隐藏错误而不是解决错误的趋势:

if(readed[i] != null) {

如果不是因为以前的错误,则不需要此代码。我相信您第一次运行循环时会遇到空指针异常,而不是检查填充数组的逻辑(那里的null值是什么?!)您只是消除了症状。这就像吞下一个例外:因为你不喜欢某些新闻而射杀信使。

编辑/更新

至于创建表,Android 中的每个 sqlite 数据库都有一个版本号(一个可以读取或写入的简单 int,一个新数据库以 0 开头),因此处理此问题的低级方法是:

if (database.getVersion == 0) { // ...在此处创建表... database.setVersion(1); }

大多数人最终使用 Sqliteopenhelper,因为它有助于解决其他问题(您还没有遇到,但可能会遇到),例如并发访问数据库。

于 2013-05-25T13:27:19.107 回答