按名称的Andr​​oid的SQLite搜索名称、Andr、SQLite、oid

2023-09-06 00:01:34 作者:思念你的心、没人能代替

我把一个例子使用SQLite从这里工作在Android版本: HTTP:// WWW .cnblogs.com / pangblog / P / 3327696.html

和我蒋张关系与名获得联系。我怎样才能改变GetContact功能按名称搜索?

数据库处理器:

 公共类数据库处理器扩展SQLiteOpenHelper {

    //数据库版本
    私有静态最终诠释DATABASE_VERSION = 1;

    //数据库名称
    私有静态最后弦乐DATABASE_NAME =contactsManager;

    //联系方式表名
    私有静态最后弦乐TABLE_CONTACTS =人脉;

    //联系方式表列名
    私有静态最后弦乐KEY_ID =ID;
    私有静态最后弦乐KEY_NAME =名;
    私有静态最后弦乐KEY_PH_NUM =PHONE_NUMBER;

    公共数据库处理器(上下文的背景下){
        超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
    }

    //创建表:CREATE TABLE TABLE_NAME(列COLUMN_TYPE);
    @覆盖
    公共无效的onCreate(SQLiteDatabase DB){
        字符串CREATE_CONTACTS_TABLE =CREATE TABLE+ TABLE_CONTACTS +(
                + KEY_ID +INTEGER PRIMARY KEY,+ KEY_NAME +TEXT
                + KEY_PH_NUM +TEXT+);
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

    //升级数据库
    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
        如果存在//删除旧的表
        db.execSQL(DROP TABLE IF EXISTS+ TABLE_CONTACTS);

        //再次创建表
        的onCreate(DB);
    }


    //添加新联系人
    无效的addContact(联系方式联系我们){
        SQLiteDatabase DB = this.getWritableDatabase();

        ContentValues​​值=新ContentValues​​();
        values​​.put(KEY_NAME,contact.getName()); // 联系人姓名
        values​​.put(KEY_PH_NUM,contact.getPhoneNumber()); //联系电话

        //插入行
        db.insert(TABLE_CONTACTS,空,价值观);
        db.close(); //闭幕数据库连接
    }

    //获取单触点
    联系getContact(INT ID){
        SQLiteDatabase DB = this.getReadableDatabase();

        光标光标= db.query(TABLE_CONTACTS,新的String [] {KEY_ID,
                KEY_NAME,KEY_PH_NUM},KEY_ID +=?,
                新的String [] {将String.valueOf(ID)},NULL,NULL,NULL,NULL);
        如果(光标!= NULL)
            cursor.moveToFirst();

        联系方式联系我们=新的联系方式(的Integer.parseInt(cursor.getString(0)),
                cursor.getString(1),cursor.getString(2));

        返回接触;
    }

    //获取所有联系人
    公开名单<联系与GT; getAllContacts(){
        名单<联系与GT; contactList =新的ArrayList<联系与GT;();
        //选择所有的查询:SELECT * FROM tableName值WHERE条件
        字符串selectQuery =SELECT * FROM+ TABLE_CONTACTS;

        SQLiteDatabase DB = this.getWritableDatabase();
        光标光标= db.rawQuery(selectQuery,NULL);

        //遍历所有行和添加到列表
        如果(cursor.moveToFirst()){
            做 {
                联系方式联系我们=新联系();
                contact.setID(的Integer.parseInt(cursor.getString(0)));
                contact.setName(cursor.getString(1));
                contact.setPhoneNumber(cursor.getString(2));
                //添加联系人列出
                contactList.add(接触);
            }而(cursor.moveToNext());
        }

        返回contactList;
    }


}
 

联系方式:

 公共类联系{

    INT _id;
    字符串_name;
    字符串_phone_number;


    公共联系(){

    }


    公共联系(INT ID,字符串名称,字符串PHONE_NUMBER){
        this._id = ID;
        this._name =名称;
        this._phone_number = PHONE_NUMBER;
    }


    公共联系(字符串名称,字符串PHONE_NUMBER){
        this._name =名称;
        this._phone_number = PHONE_NUMBER;
    }

    公众诠释的getID(){
        返回this._id;
    }

    公共无效SETID(INT ID){
        this._id = ID;
    }

    公共字符串的getName(){
        返回this._name;
    }

    公共无效setname可以(字符串名称){
        this._name =名称;
    }

    公共字符串getPhoneNumber(){
        返回this._phone_number;
    }

    公共无效setPhoneNumber(字符串PHONE_NUMBER){
        this._phone_number = PHONE_NUMBER;
    }


}
 

解决方案

在哪里在getContact数据库查询子句是目前的id =?将被替换为id参数。你需要做的的名称搜索什么是修改部分。

  //获取单个联系人
联系getContact(字符串名称){
    SQLiteDatabase DB = this.getReadableDatabase();

    光标光标= db.query(TABLE_CONTACTS,新的String [] {KEY_ID,
            KEY_NAME,KEY_PH_NUM},KEY_NAME +=?,
            新的String [] {名},NULL,NULL,NULL,NULL);
    // ...
 

您也应该改变工作codeA位,因为它不是真正的安全。游标不能是(实践),但 cursor.moveToFirst()能/会失败,如果有没有这样的名称数据库中。如果失败,你会得到一个异常的 cursor.getString(0)因为游标没有行从中获取数据。

删除该检查,并做检查光标是否可以移动到第一位置(不为空)。你也应该关闭游标一旦你不需要它了。

 联系方式联系方式= NULL;
如果(cursor.moveToFirst()){
    触点=新的联系方式(的Integer.parseInt(cursor.getString(0)),
            cursor.getString(1),cursor.getString(2));
}
cursor.close();
如果没有接触,发现//可以返回null。
返回接触;
 

I took an example for working with SQLite in Android from here: http://www.cnblogs.com/pangblog/p/3327696.html

And I strugle with getting contact by name. How can I change GetContact function to search by name?

DatabaseHandler:

public class DatabaseHandler extends SQLiteOpenHelper {

    //Database Version 
    private static final int DATABASE_VERSION = 1;

    //Database Name
    private static final String DATABASE_NAME = "contactsManager";

    //Contacts table name 
    private static final String TABLE_CONTACTS = "contacts";

    //Contacts Table Columns names 
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_PH_NUM = "phone_number";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables : CREATE TABLE table_name (column_name column_type);
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NUM + " TEXT" + ")";       
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed 
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

        // Create tables again
        onCreate(db);
    }   


    //Adding new contact 
    void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NUM, contact.getPhoneNumber()); // Contact Phone

        // Inserting Row
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Closing database connection
    }

    // Getting single contact 
    Contact getContact(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NUM }, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();

        Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2));

        return contact;
    }

    // Getting All Contacts
    public List<Contact> getAllContacts() {
        List<Contact> contactList = new ArrayList<Contact>();
        // Select All Query :SELECT * FROM tableName WHERE criteria
        String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Contact contact = new Contact();
                contact.setID(Integer.parseInt(cursor.getString(0)));
                contact.setName(cursor.getString(1));
                contact.setPhoneNumber(cursor.getString(2));
                // Adding contact to list
                contactList.add(contact);
            } while (cursor.moveToNext());
        }

        return contactList;
    }


}

Contact:

public class Contact {

    int _id;
    String _name;
    String _phone_number;


    public Contact() {

    }


    public Contact(int id, String name, String phone_number) {
        this._id = id;
        this._name = name;
        this._phone_number = phone_number;
    }


    public Contact(String name, String phone_number) {
        this._name = name;
        this._phone_number = phone_number;
    }

    public int getID() {
        return this._id;
    }

    public void setID(int id) {
        this._id = id;
    }

    public String getName() {
        return this._name;
    }

    public void setName(String name) {
        this._name = name;
    }

    public String getPhoneNumber() {
        return this._phone_number;
    }

    public void setPhoneNumber(String phone_number) {
        this._phone_number = phone_number;
    }


}

解决方案

The where clause in the database query in getContact is currently id = ? and the ? is replaced with the id parameter. What you need to do to search by the name is to modify that part.

// Getting single contact 
Contact getContact(String name) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
            KEY_NAME, KEY_PH_NUM }, KEY_NAME + "=?",
            new String[] { name }, null, null, null, null);
    //...

You should also change the "working" code a bit since it's not really safe. A cursor can't be null (in practice) but cursor.moveToFirst() can / will fail if there is no such name in the database. If it fails you will get an exception at cursor.getString(0) because the cursor has no row to get data from.

Drop the null check, and do check whether cursor could be moved to the first position (is not empty). You should also close the cursor once you don't need it anymore.

Contact contact = null;
if (cursor.moveToFirst()) {
    contact = new Contact(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2));
}
cursor.close();
// can return null if no contact was found.
return contact;