【问题标题】:MySQLite Database results not being printed outSQLite 数据库结果未打印出来
【发布时间】:2016-02-09 09:48:02
【问题描述】:

在我的数据库表中插入行并尝试获取它们以显示后,我得到一个空白活动。这让我感到困惑,因为它曾经在一个月前工作,但现在不行了。

我什至通过tutorial link 了解更多信息,但这一切都是徒劳的。

下面是数据库表的构造函数部分:

// Emptry constructor
public Contact() {

}

// Constructor
public Contact(int _contactid, String contactphone, String contactlmp) {
    this._contactid = _contactid;
    this.contactphone = contactphone;
    this.contactlmp = contactlmp;
}

// Constructor
public Contact(String contactphone, String contactlmp) {
    this.contactphone = contactphone;
    this.contactlmp = contactlmp;
}

下面是我用来检索表中所有元素的数据库函数:

public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<>();

    String query = "SELECT * FROM " + TABLE_CONTACTS + ";";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor c = db.rawQuery(query, null);

    if(c != null)
        c.moveToFirst();

    // Loop through all rows and add to list
    while(!c.isAfterLast()) {
        Contact contact = new Contact();
        contact.set_contactid(Integer.parseInt(c.getString(0)));
        contact.setContactphone(c.getString(1));
        contact.setContactlmp(c.getString(2));

        contactList.add(contact);

        c.moveToNext();
    }

    return contactList;
}

下面是对该函数的调用,它使用结果在该活动上打印出来。这嵌入在 Activity 的 onCreate() 函数中的线程中:

contacts = (TextView) findViewById(R.id.contacts);
dbHandler = new MyDBHandler(this, null, null, 1);
Runnable r = new Runnable() {
        @Override
        public void run() {
            //dbString = dbHandler.databaseToString();
            int i = 1;
            dbContacts = dbHandler.getAllContacts();
            for(Contact cn : dbContacts) {
                dbString += i + "    " + cn.getContactphone() + "    " + cn.getContactlmp() + "\n";
                i++;
            }
        }
    };
    Thread thread = new Thread(r);
    thread.start();
    contacts.setText(dbString);

以下是数据库联系人的 getter 和 setter 方法,它们在同一应用程序的另一个上下文中使用时可以工作:

// Getter and Setter methods
public int get_contactid() {
    return _contactid;
}

public void set_contactid(int _contactid) {
    this._contactid = _contactid;
}

public String getContactlmp() {
    return contactlmp;
}

public void setContactlmp(String contactlmp) {
    this.contactlmp = contactlmp;
}

public String getContactphone() {
    return contactphone;
}

public void setContactphone(String contactphone) {
    this.contactphone = contactphone;
}

我可能做错了什么?为什么突然停止工作?

【问题讨论】:

  • 如果你修改了你的数据库内容......比如表格、行和列。那么您需要更改数据库名称和数据库版本。
  • 我没有修改我的数据库内容,但我按照你的建议尝试了,但一无所获
  • 读取表时,我们需要调用 SQLiteDatabase db = this.getReadableDatabase();
  • 试过了,还是不行

标签: android mysql sqlite


【解决方案1】:

任何错误日志,或者您是否进行了任何数据库更改(结构方面)

contacts = (TextView) findViewById(R.id.contacts);
dbHandler = new MyDBHandler(this, null, null, 1);
Runnable r = new Runnable() {
        @Override
        public void run() {
            //dbString = dbHandler.databaseToString();
            int i = 1;
            dbContacts = dbHandler.getAllContacts();
            for(Contact cn : dbContacts) {
                dbString += i + "    " + cn.getContactphone() + "    " + cn.getContactlmp() + "\n";
                i++;
            }
            contacts.setText(dbString);
        }
    };
    Thread thread = new Thread(r);
    thread.start();

【讨论】:

  • 没有错误日志,我也没有更改数据库。当我尝试使用以下代码检索最后一个联系人时,它可以工作: public String getPhone() { SQLiteDatabase db = this.getWritableDatabase();字符串查询 = "SELECT * FROM " + TABLE_CONTACTS + " WHERE 1;";光标 c = db.rawQuery(query, null);如果(c == null)返回null; c.moveToLast();字符串电话 = c.getString(c.getColumnIndex(CONTACT_COLUMN_PHONE));尝试{返回电话; } 最后 { c.close(); db.close(); } }
【解决方案2】:

我想通了。我试图从工作线程更改 UI,这就是为什么我没有得到任何结果。我必须使用处理程序和工作线程来执行数据库查询并更新 UI,如下所示:

final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int i = 1;
            dbContacts = dbHandler.getAllContacts();
            for(Contact cn : dbContacts) {
                dbString += i + "    " + cn.getContactphone() + "    " + cn.getContactlmp() + "\n";
                i++;
            }
            contacts.setText(dbString);
        }
    };

    Runnable r = new Runnable() {
        @Override
        public void run() {
            handler.sendEmptyMessage(0);
        }
    };
    Thread thread = new Thread(r);
    thread.start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2018-04-26
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多