Android:从ListView Selected Item获取数据库项

时间:2012-10-09 14:52:28

标签: android sqlite android-listview

我正在开发一个Android项目,我正在尝试从包含数据库项条目的listView中选择的任何项目中获取有关数据库项的信息。我是android和SQLite的新手所以我不确定几件事情。对于列表视图,我该怎么做才能使项目可点击,然后使用它来从数据库中获取有关该项目的信息。

在一个不相关的问题上,我如何检查数据库中的名称列表以防止用户输入重复项?

以下是ContactsMenu类的代码,其中包含listview。

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.database.sqlite.SQLiteDatabase;
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); 
        }





////////////////MENU////////////////////////////////////////////////////////////////////////////////
    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;

    }
}

以下是DatabaseSetup类的代码。

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"; 

} 

最后一个问题是我的AddContact类

package com.emailandcontactmanager;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
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.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class AddContact extends Activity
{
    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);

        DatabaseSetup.init(this);

        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();

                    if(name != null & mail != null) {
                    DatabaseSetup entry = new DatabaseSetup(AddContact.this);
                    DatabaseSetup.getDb();
                    DatabaseSetup.createEntry(name, mail, phone1, phone2, address, notes);
                    entry.close();
                    }
                    else{
                        Toast.makeText(getApplicationContext(),
                                "Must enter name and email for contact",
                                Toast.LENGTH_LONG).show();

                    }

                    }
                    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();

                        }
                    }       
            }   
        });
    }
////////////////MENU///////////////////////////////////////////////MENU/////////////////////////////
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 = {"Name Field", "Email Field", "Phone1&2 Fields", "Address Field", "Notes Field", "Add Button"};

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(),
                                        "Enter the desired name of a contact. This is a required field",
                                        Toast.LENGTH_LONG).show();
                                break;
                            case 1:
                                Toast.makeText(getApplicationContext(),
                                        "Enter the email address of the contact. This is a required field.",
                                        Toast.LENGTH_LONG).show();
                                break;
                            case 2:
                                Toast.makeText(getApplicationContext(),
                                        "Enter the phone number(s) of the contact. Both fields are optional",
                                        Toast.LENGTH_LONG).show();
                                break;
                            case 3:
                                Toast.makeText(getApplicationContext(),
                                        "Enter the address of the contact. This field is optional",
                                        Toast.LENGTH_LONG).show();
                                break;
                            case 4:
                                Toast.makeText(getApplicationContext(),
                                        "Enter notes about the contact. This field is optional",
                                        Toast.LENGTH_LONG).show();
                                break;
                            case 5:
                                Toast.makeText(getApplicationContext(),
                                        "This button will save the contact to the database. When you are done saving contacts, click back to return to the contacts menu.",
                                        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;

        }
    }

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

使用onItemClickonItemLongClick(使用长按)并使用该位置指向数据库中的数据

http://www.mysamplecode.com/2012/07/android-listview-cursoradapter-sqlite.html这是一个详细的例子。希望它有帮助。