2

在遵循了几个没有成功的例子之后,我发现自己在这个问题上陷入了死胡同。我遇到的问题是如何ListView从数据库中填充数据。

目的是使用列表视图创建一个屏幕,该屏幕仅从数据库中显示名称列,然后选择项目时,应用程序进入新屏幕,其中它显示与该项目相关的其他数据。

我想帮助理解的事情是ListView从我的数据库表“联系人”中的“名称”列中填充数据,然后根据所选项目从数据库的行中获取数据。

这是 ContactsMenu 类的代码,其中将显示名称。

package com.emailandcontactmanager;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class ContactsMenu extends Activity {


    ListView listView;
    public static final String fields[] = { DatabaseSetup.colName};
    Cursor cursor;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.managecontacts);
        listView = (ListView) findViewById(R.id.lstContacts); 
        DatabaseSetup.init(this); 

        Button btnAddItem = (Button) findViewById(R.id.btnAddContact);
        btnAddItem.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent addItem = new Intent(v.getContext(), AddContact.class);
            startActivity(addItem);
        }
        });
    }
        @Override
        protected void onPause() {
            listView.setAdapter(null);
            cursor.close();
            DatabaseSetup.deactivate();
            super.onPause();
        }

        @Override
        protected void onResume() {
            super.onResume();
            DatabaseSetup.init(this);
            cursor = DatabaseSetup.getContactNames();
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, cursor, fields, new int[] {R.id.item_text});
            listView.setAdapter(adapter); 
        }


    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
            switch (which){ 
            case DialogInterface.BUTTON_POSITIVE: 
                finish();
                break; 

            case DialogInterface.BUTTON_NEGATIVE: 
                //Nothing happens on No button click, and the menu closes
                break; 
            } 
        } 
    }; 

    @Override
    public boolean onCreateOptionsMenu(Menu mainmenu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.mainmenu, mainmenu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        final CharSequence[] items = {"Contacts list", "Add Contact"};

        switch (item.getItemId()) {
            case R.id.help:     AlertDialog.Builder builder = new AlertDialog.Builder(this);
                                builder.setTitle("Select a function to revice information about it.");
                                builder.setItems(items, new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int selected) {
                                        switch(selected){
                                        case 0:
                                            Toast.makeText(getApplicationContext(),
                                                    "Allows you to view the selected item and make editations to it or delete it.",
                                                    Toast.LENGTH_LONG).show();
                                            break;
                                        case 1:
                                            Toast.makeText(getApplicationContext(),
                                                    "Allows you to add a new contact by bringing up a screen where the nececary information can be entered.",
                                                    Toast.LENGTH_LONG).show();
                                        }
                                    }
                                });
                                builder.show();
                                break;

                                case R.id.back:     AlertDialog.Builder builderBack = new AlertDialog.Builder(this); 
                                                    builderBack.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener) 
                                                    .setNegativeButton("No", dialogClickListener).show(); 
                                break;
        }
        return true;

    }
}

数据库设置类

package com.emailandcontactmanager;

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

/* 
 * usage:  
 * DatabaseSetup.init(egActivityOrContext); 
 * DatabaseSetup.createEntry() or DatabaseSetup.getContactNames() or DatabaseSetup.getDb() 
 * DatabaseSetup.deactivate() then job done 
 */ 

class DatabaseSetup extends SQLiteOpenHelper { 
static DatabaseSetup instance = null; 
static SQLiteDatabase db = null; 

public static void init(Context context) { 
    if (null == instance) { 
        instance = new DatabaseSetup(context); 
        } 
    } 

public static SQLiteDatabase getDb() { 
    if (null == db) { 
        db = instance.getWritableDatabase(); 
        } 
    return db; 
    } 

public static void deactivate() { 
    if (null != db && db.isOpen()) { 
        db.close(); 
        } 
    db = null; 
    instance = null; 
    } 

public static long createEntry(String name, String mail, String phone1, 
        String phone2, String address, String notes) { 
    ContentValues cv = new ContentValues(); 
    cv.put(colName, name); 
    cv.put(colMail, mail); 
    cv.put(colPhone1, phone1); 
    cv.put(colPhone2, phone2); 
    cv.put(colAddress, address); 
    cv.put(colNotes, notes); 
    return getDb().insert(contactsTable, null, cv); 

    } 

public static Cursor getContactNames() { 
    // TODO Auto-generated method stub 
    String[] columns = new String[] {"_id", colName }; 
    return getDb().query(contactsTable, columns, null, null, null, null, 
            null); 
    } 

DatabaseSetup(Context context) { 
    super(context, dbName, null, dbVersion); 
    } 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL("CREATE TABLE IF NOT EXISTS " + contactsTable 
            + " (_id integer primary key autoincrement, " + colName 
            + " TEXT NOT NULL, " + colMail + " TEXT NOT NULL, " + colPhone1 
            + " TEXT NOT NULL, " + colPhone2 + " TEXT NOT NULL, " 
            + colAddress + " TEXT NOT NULL, " + colNotes 
            + " TEXT NOT NULL)"); 

    db.execSQL("CREATE TABLE IF NOT EXISTS " + templatesTable 
            + " (_id integer primary key autoincrement, " + colSubject 
            + " TEXT NOT NULL, " + colBody + " TEXT NOT NULL)"); 

    db.execSQL("CREATE TABLE IF NOT EXISTS " + tagsTable 
            + " (_id integer primary key autoincrement, " + colTagName 
            + " TEXT NOT NULL, " + colContact + " TEXT NOT NULL)"); 

    } 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + contactsTable); 
    db.execSQL("DROP TABLE IF EXISTS " + templatesTable); 
    db.execSQL("DROP TABLE IF EXISTS " + tagsTable); 
    onCreate(db); 
    } 

static final String dbName = "DB"; 
static final int dbVersion = 1; 
static final String contactsTable = "Contacts"; 
static final String colName = "Name"; 
static final String colMail = "Email"; 
static final String colPhone1 = "Phone1"; 
static final String colPhone2 = "Phone2"; 
static final String colAddress = "Address"; 
static final String colNotes = "Notes"; 

static final String templatesTable = "Templates"; 
static final String colSubject = "Subject"; 
static final String colBody = "Body"; 

static final String tagsTable = "Tags"; 
static final String colTagName = "Name"; 
static final String colContact = "Contact"; 

} 

要添加到联系人菜单的类的代码。当我有一个临时显示器时,它曾经可以工作,但是,现在不行了。

package com.emailandcontactmanager;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AddContact extends Activity
{

    Button saveContact;
    EditText contactName, contactMail, contactPhone1, contactPhone2, contactAddress, contactNotes; 

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newcontact);


        contactName = (EditText) findViewById(R.id.txtName);
        contactMail = (EditText) findViewById(R.id.txtMail);
        contactPhone1 = (EditText) findViewById(R.id.txtPhone1);
        contactPhone2 = (EditText) findViewById(R.id.txtPhone2);
        contactAddress = (EditText) findViewById(R.id.txtAddress);
        contactNotes = (EditText) findViewById(R.id.txtNotes);
       // saveContact = (Button) findViewById(R.id.btnSaveContact);

        Button btnSaveContact = (Button) findViewById(R.id.btnSaveContact);
        btnSaveContact.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                boolean working = true;

                try{
                    String name = contactName.getText().toString();
                    String mail = contactMail.getText().toString();
                    String phone1 = contactPhone1.getText().toString();
                    String phone2 = contactPhone2.getText().toString();
                    String address = contactAddress.getText().toString();
                    String notes = contactNotes.getText().toString();

                    DatabaseSetup entry = new DatabaseSetup(AddContact.this);
                    DatabaseSetup.getDb();
                    DatabaseSetup.createEntry(name, mail, phone1, phone2, address, notes);
                    entry.close();

                    }
                    catch(Exception e)
                    {
                        working = false;
                        String error = e.toString();
                        Dialog d = new Dialog(AddContact.this);
                        d.setTitle("Error");
                        TextView tv = new TextView(AddContact.this);
                        tv.setText(error);
                    }
                    finally
                    {
                        if(working)
                        {
                            Dialog d = new Dialog(AddContact.this);
                            d.setTitle("Success");
                            TextView tv = new TextView(AddContact.this);
                            tv.setText("The database changes have succeeded.");
                            d.setContentView(tv);
                            d.show();

                        }
                    }       
            }   
        });
    }
}
4

2 回答 2

3

这是活动示例代码:

public class MainActivity extends Activity {
ListView listView;
public static final String fields[] = { DatabaseSetup.colName };
Cursor cursor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.managecontacts);
    listView = (ListView) findViewById(R.id.lstContacts);
    DatabaseSetup.init(this);
    for (Integer i = 0; i < 120; ++i) {
        DatabaseSetup.createEntry("Name " + i, "Mail " + i, "Phone1 " + i,
                "Phone2 " + i, "Address " + i, "Notes " + i);
    }
}

@Override
protected void onPause() {
    listView.setAdapter(null);
    cursor.close();
    DatabaseSetup.deactivate();
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    DatabaseSetup.init(this);
    cursor = DatabaseSetup.getContactNames();
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.row, cursor, fields, new int[] { R.id.item_text });
    listView.setAdapter(adapter);
}

}

这是 DatabaseSetup 示例代码:

/*
 * usage: 
 * DatabaseSetup.init(egActivityOrContext);
 * DatabaseSetup.createEntry() or DatabaseSetup.getContactNames() or DatabaseSetup.getDb()
 * DatabaseSetup.deactivate() then job done
 */

class DatabaseSetup extends SQLiteOpenHelper {
static DatabaseSetup instance = null;
static SQLiteDatabase db = null;

public static void init(Context context) {
    if (null == instance) {
        instance = new DatabaseSetup(context);
    }
}

public static SQLiteDatabase getDb() {
    if (null == db) {
        db = instance.getWritableDatabase();
    }
    return db;
}

public static void deactivate() {
    if (null != db && db.isOpen()) {
        db.close();
    }
    db = null;
    instance = null;
}

public static long createEntry(String name, String mail, String phone1,
        String phone2, String address, String notes) {
    ContentValues cv = new ContentValues();
    cv.put(colName, name);
    cv.put(colMail, mail);
    cv.put(colPhone1, phone1);
    cv.put(colPhone2, phone2);
    cv.put(colAddress, address);
    cv.put(colNotes, notes);
    return getDb().insert(contactsTable, null, cv);

}

public static Cursor getContactNames() {
    // TODO Auto-generated method stub
    String[] columns = new String[] { "_id", colName };
    return getDb().query(contactsTable, columns, null, null, null, null,
            null);
}

private DatabaseSetup(Context context) {
    super(context, dbName, null, dbVersion);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("CREATE TABLE IF NOT EXISTS " + contactsTable
            + " (_id integer primary key autoincrement, " + colName
            + " TEXT NOT NULL, " + colMail + " TEXT NOT NULL, " + colPhone1
            + " TEXT NOT NULL, " + colPhone2 + " TEXT NOT NULL, "
            + colAddress + " TEXT NOT NULL, " + colNotes
            + " TEXT NOT NULL)");

    db.execSQL("CREATE TABLE IF NOT EXISTS " + templatesTable
            + " (_id integer primary key autoincrement, " + colSubject
            + " TEXT NOT NULL, " + colBody + " TEXT NOT NULL)");

    db.execSQL("CREATE TABLE IF NOT EXISTS " + tagsTable
            + " (_id integer primary key autoincrement, " + colTagName
            + " TEXT NOT NULL, " + colContact + " TEXT NOT NULL)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + contactsTable);
    db.execSQL("DROP TABLE IF EXISTS " + templatesTable);
    db.execSQL("DROP TABLE IF EXISTS " + tagsTable);
    onCreate(db);
}

static final String dbName = "DB";
static final int dbVersion = 1;
static final String contactsTable = "Contacts";
static final String colName = "Name";
static final String colMail = "Email";
static final String colPhone1 = "Phone1";
static final String colPhone2 = "Phone2";
static final String colAddress = "Address";
static final String colNotes = "Notes";

static final String templatesTable = "Templates";
static final String colSubject = "Subject";
static final String colBody = "Body";

static final String tagsTable = "Tags";
static final String colTagName = "Name";
static final String colContact = "Contact";

}

这是'res/layout/row.xml'

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

希望能帮助到你。

于 2012-09-24T16:09:31.760 回答
0

您的堆栈跟踪表明问题是您没有指定列“_id”。你们没有一张桌子有它。您需要该列才能对光标适配器进行任何操作。这是这样说的文档:http: //developer.android.com/reference/android/widget/CursorAdapter.html

只需添加列以确保您的表可以与 CursorAdapters 一起使用。

于 2012-10-05T15:03:39.650 回答