【问题标题】:insert to database and automatically update listview插入数据库并自动更新列表视图
【发布时间】:2013-09-24 21:43:05
【问题描述】:

我已经在 android 中创建了一个具有单个活动的项目,我想通过按“插入按钮”将新记录添加到数据库中,如图所示,但我想尽快将新记录保存到数据库,ListView更新并将添加的记录显示到列表的最后一个位置...

当我运行此代码时发生意外错误并关闭 错误或任何建议在哪里...

我把所有的代码和布局都放在这里...

MainActivity.java

package com.example.db;

import java.util.ArrayList;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

Button Btninser;
SQLiteDatabase db;
EditText etName, etPhone;
ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    etName = (EditText) findViewById(R.id.etName);
    etPhone = (EditText) findViewById(R.id.etPhone);
    Btninsert = (Button) findViewById(R.id.btnInsert);
    lv = (ListView) findViewById(R.id.listView1);
    Btninsert.setOnClickListener(this);
    Open_Create();

}

    public void Open_Create() {
    db = openOrCreateDatabase("MyDB1", MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS MyTable (_id INTEGER PRIMARY KEY AUTOINCREMENT, LastName VARCHAR,Phone VARCHAR);");

}

public void Insert_Info() {
    db.execSQL("INSERT INTO MyTable (LastName,Phone) VALUES('" + etName.getText().toString()
            + "','" + etPhone.getText().toString() + "');");

    Populate_ListView();

    // db.close();
    Toast.makeText(this, "Data has been saved!", Toast.LENGTH_LONG).show();

}

public void Populate_ListView() {
    Cursor cursor = db.rawQuery("SELECT LastName,Phone FROM MyTable", null);
    startManagingCursor(cursor);

    String[] from = new String[] { "LastName", "Phone" };
    int[] to = new int[] { R.id.tvItemListName, R.id.tvItemListPhone };

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.item_list, cursor, from, to);

    lv.setAdapter(adapter);
}

这里是 XML 文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

         <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="Name" />

        <EditText
            android:id="@+id/etName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/textView1"
            android:ems="10" >

            <requestFocus />
        </EditText>

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="Phone" />

        <EditText
            android:id="@+id/etPhone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/textView1"
            android:ems="10" >
        </EditText>

        <Button
            android:id="@+id/btnInsert"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="Insert" />

    <ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="21dp" >
    </ListView>

</RelativeLayout>

我还添加了来自 DDMS 的错误 正如您在错误页面中看到的那样它提到了一个字段“_id我从来没有!!!! :( 太让我困惑了……

【问题讨论】:

  • “意外错误”是指崩溃吗?如果是这样,请发布崩溃日志。在任何情况下,只需在插入新条目后执行 notifyDatasetChanged() 即可告诉列表视图自行更新。

标签: android database android-activity android-listview simplecursoradapter


【解决方案1】:

如果您想使用游标,Android 会自动假定您的表有一个名为 _id 的列,它充当行的唯一主标识符,有关详细信息,请参阅 CursorAdapter's documentation 的“类概述”部分其中说:

将数据从 Cursor 公开到 ListView 小部件的适配器。游标必须包含名为“_id”的列,否则此类将不起作用。

基本上,您需要做的就是将您的 CREATE TABLE 电话替换为:

db.execSQL("CREATE TABLE IF NOT EXISTS MyTable (_id INTEGER PRIMARY KEY AUTOINCREMENT, LastName VARCHAR,Phone VARCHAR);");

这应该可以解决您的崩溃问题。要让它自动刷新列表,请参阅我的评论重新评分notifyDatasetChanged()

作为旁注:我强烈建议使用SQLiteOpenHelper 实例来处理表的打开和创建,而不是你现在正在做的事情,重复调用CREATE TABLE IF NOT EXISTS 是不好的形式,你只能在您知道需要调用它的时候调用它。 Vogella.com has a great guide on that.

编辑:根据您对代码的上次编辑:您仍然没有请求您创建的 _id 字段。如果您的 SELECT 语句中没有它,则游标无法访问它!

Populate_ListView 中的rawQuery 替换为SELECT * FROM MyTable,这样光标也会返回_id 字段。

【讨论】:

  • 如果我再次使用这行代码出现和之前一样的错误,_id 不存在!!!
  • 自从您修改代码后,您尚未卸载应用程序并重新安装它,因此您的表不会再次重新创建,因为您使用的是 CREATE TABLE IF NOT EXISTS 并且您的数据库已经存在。卸载应用并重试。
【解决方案2】:

您是否尝试从onClick() 方法中删除Open_Create() 调用?您连续两次致电openOrCreateDatabase(),中间没有任何close()。不要忘记try { ... } catch (SQLiteException) { ... }。你测试一下。

【讨论】:

  • @kasra Rahjerdi 我按照你说的添加了错误,现在问题出在哪里?
  • 可能该列不存在,如控制台建议的那样。但是我不建议您使用“startManagingCursor(Cursor c)”。阅读下文:“此方法在 API 级别 11 中已弃用。请改用带有 LoaderManager 的新 CursorLoader 类;这也可通过 Android 兼容性包在旧平台上使用。”
  • 该类以标准方式实现了用于查询游标的 Loader 协议,基于 AsyncTaskLoader 在后台线程上执行游标查询,从而不会阻塞应用程序的 UI。
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多