在列表视图中显示数据库中的数据

Posted

技术标签:

【中文标题】在列表视图中显示数据库中的数据【英文标题】:show data from database in listview 【发布时间】:2013-02-15 00:18:06 【问题描述】:

这是我的数据库代码,我想从我的数据库中检索名称并将其显示在 listview 中,该名称在下面发布为 profilelist.jar 的另一个 java 文件中。但我无法做到这一点,请告诉我此代码是否正确?

package a.vaccination;

import android.annotation.TargetApi;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.util.Log;

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public class datahandler 

    public static final String KEY_ROWID = "id";
    public static final String KEY_name = "name";
    public static final String KEY_dob = "dob";
    public static final String KEY_contact = "contact";
    public static final String KEY_email = "email";
    private static final String TAG = "DBAdapter";

    private static final String DATABASE_NAME = "profile";
    private static final String DATABASE_TABLE = "baby";
    private static final int DATABASE_VERSION = 2;

    private static final String DATABASE_CREATE = "create table if not exists"
            + DATABASE_TABLE
            + "(id integer primary key autoincrement, "
            + "name VARCHAR not null, dob date, contact VARCHAR, email  
VARCHAR);";
    private final Context context;

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public datahandler(Context ctx) 
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    

    protected static class DatabaseHelper extends SQLiteOpenHelper 
        DatabaseHelper(Context context) 
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        

        @Override
        public void onCreate(SQLiteDatabase db) 
            // TODO Auto-generated method stub
            try 
                db.execSQL(DATABASE_CREATE);
                // db = DBHelper.getWritableDatabase();
                Log.i(DATABASE_NAME, "create");
             catch (SQLException e) 
                e.printStackTrace();
            
        

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
            // TODO Auto-generated method stub
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old 
data");
            db.execSQL("DROP TABLE IF EXISTS contacts");
            onCreate(db);
        
    

    // ---opens the database---
    public datahandler open() throws SQLException 
        db = DBHelper.getWritableDatabase();
        return this;
    

    // ---closes the database---
    public void close() 
        DBHelper.close();
    

    // ---insert a record into the database---
    public long insertRecord(String name, String dob, String contact,
            String email) 
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_name, name);
        initialValues.put(KEY_dob, dob);
        initialValues.put(KEY_contact, contact);
        initialValues.put(KEY_email, email);
        Log.i(DATABASE_NAME, "values added");
        return db.insert(DATABASE_TABLE, null, initialValues);

    

    // ---updates a record---
    public boolean updateRecord(long rowId, String name, String dob,
            String contact, String email) 
        ContentValues args = new ContentValues();
        args.put(KEY_name, name);
        args.put(KEY_dob, dob);
        args.put(KEY_contact, contact);
        args.put(KEY_email, email);
        return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    

    public Cursor getAllTitles() 
        return db.query(DATABASE_TABLE, new String[]  KEY_ROWID, KEY_name,
                KEY_dob, KEY_contact, KEY_email , null, null, null, null,
                null, null);
    

    // ---retrieves a particular title---

    public Cursor getTitle(long rowId) throws SQLException 
        Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] 
                KEY_ROWID, KEY_name, KEY_email, KEY_dob, KEY_contact ,
                KEY_ROWID + "=" + rowId, null, null, null, null, null, 
null);
        if (mCursor != null) 
            mCursor.moveToFirst();
        
        return mCursor;
    

    public void getReadableDatabase() 
        // TODO Auto-generated method stub
        Cursor cur = db
                .rawQuery("select rowid _id,* from DATABASE_TABLE", null);
    

profilelist.java

package a.vaccination;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

//this shows profies of baby and option of add new one
public class profilelist extends Activity implements OnItemClickListener 

    datahandler db = new datahandler(this);
    SimpleCursorAdapter adapter = null;
    Cursor c;

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.child);

        Button add = (Button) findViewById(R.id.button1);
        add.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // navigate to create profile
                Intent it = new Intent(profilelist.this, 
createprofile.class);
                startActivity(it);

            
        );


        db.open();
        Cursor c = db.getAllTitles();
        if (c.moveToFirst()) 
            do 
                DisplayRecord(c);
             while (c.moveToNext());
        
        db.close();

        // ---get a Record---
        db.open();
        c = db.getTitle(2);
        if (c.moveToFirst())
            DisplayRecord(c);
        else
            Toast.makeText(this, "No Assignments found", Toast.LENGTH_LONG)
                    .show();
        db.close();

    

    public void DisplayRecord(Cursor c) 
        // TODO Auto-generated method stub
        Toast.makeText(
                this,
                "id: " + c.getString(0) + "\n" + "name: " + c.getString(1)
                        + "\n" + " dob: " + c.getString(2) + 
"contact"
                        + c.getString(3) + "email" + 
c.getString(4),

                Toast.LENGTH_SHORT).show();
        String[] columns = new String[]  datahandler.KEY_name ;
        int[] to = new int[]  R.id.name ;
        adapter = new SimpleCursorAdapter(this, R.layout.child, c, columns,
                to, 0);
        ListView names = (ListView) findViewById(R.id.listView1);
        names.setAdapter(adapter);
        names.setOnItemClickListener(this);

    

我在 a.vaccination.datahandler.getTitle(datahandler.java:115) 和 在 a.vaccination.profilelist.onCreate(profilelist.java:67) java.lang.NoSuchMethodError: android.database.sqlite.SQLiteDatabaseb.query 我在上面提供了 profilelist.java 和 datahandler.java

请帮帮我,我被困在这里了 @覆盖 公共无效 onItemClick(AdapterView arg0,查看 arg1,int arg2,long arg3) // TODO 自动生成的方法存根

        Intent i = new Intent(profilelist.this, vaccination.class);
        startActivity(i);
    



【问题讨论】:

Populating a listview from a SQLite database的可能重复 【参考方案1】:

我最近实现了这种类型的功能。基本上,您必须创建一个自定义 BaseAdapter 才能在 ListView 中显示您的数据。在适配器构造函数中,您传入包含数据的对象数组。我过去的教程是: http://www.vogella.com/articles/AndroidListView/article.html。希望这会有所帮助!

【讨论】:

通过查看它,一切看起来应该可以工作,但是您应该创建一个对象来包装您的联系人。这将使向适配器获取数据变得更加容易。只需创建一个名为 Contact、Person 等的类,使用简单的字段/getter/setter 来处理姓名、号码、DOB 等内容。然后在您的适配器中,您可以传入 ArrayList。最后,在您的 getView 部分,您可以执行 myTextView.setText(contacts.get(position)) 等操作来填写 ListView 中的数据。【参考方案2】:

回答你的第一个和第二个问题:“不,这段代码真的不好”。你真的必须考虑使用加载器。虽然您所写的内容可能在大多数情况下都有效,但您很可能会产生 Application Not Responding 错误,这些错误会突然终止您的应用程序。不要在 UI 线程上做这些事情。

有许多令人惊讶的 Android 编程。我真的建议你在把自己画到一个角落之前,先阅读一本关于如何做到这一点的标准书籍。

【讨论】:

是的,你说得对,我在运行应用程序期间遇到了意外停止操作错误。 是这样想的。在继续之前,请阅读我 (Loader) 和 Berdon (SimpleCursorAdaptor) 的建议。【参考方案3】:

您想使用像 this SimpleCursorAdapter 这样的 CursorAdapter。您将列映射传递给视图 ID 以及它处理的绑定等。

【讨论】:

【参考方案4】:

您需要创建 SimpleCursorAdapter 并将其附加到从您的数据库自定义查询选择返回的光标。然后将从光标返回的数据列映射到您的自定义视图以进行显示。要了解更多点击 Here 这为您的问题提供了正确的实施方式

【讨论】:

以上是关于在列表视图中显示数据库中的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用基本适配器和列表视图显示数据库中的数据

我的列表视图无法显示数据库中的所有元素

如何在列表视图中显示 json 数据?

如何根据sqlite数据库中的名称从drawable中获取图像,然后在列表视图中显示

将数组列表中的数据显示到列表视图,计算每个重复对象并显示为一个对象

更新和删除列表视图中的行