【问题标题】:Search and display entries in SQLite Database在 SQLite 数据库中搜索和显示条目
【发布时间】:2021-03-25 14:53:16
【问题描述】:

所以我最近开始接触 Android 编程,并一直在关注this 教程,了解如何在 SQLite 数据库中插入、更新、删除和查看数据。现在,我还想在这个 SQLite 数据库中添加搜索功能,我可以在其中搜索名称(我使用的列是名称、联系人和出生日期),如果搜索的名称与数据库中的现有名称匹配,在应用程序中显示数据库中的此行/条目。我认为这可以通过与查看/更新数据库类似的方式完成,所以我尝试以这些作为参考提出解决方案,但是在尝试了很多对我来说似乎合理的方法之后,我仍然没有没有让它工作,所以我非常感谢任何帮助!我觉得我已经接近了我的一些尝试,但逻辑上的某些东西并没有完全点击。

MainActivity.java:

package com.example.sqliteapplication;

import ...

public class MainActivity extends AppCompatActivity {



EditText name, contact, dob;
Button insert, update, delete, view, search;
DBHelper DB;

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

 
    name = findViewById(R.id.name);
    contact = findViewById(R.id.contact);
    dob = findViewById(R.id.dob);
    insert = findViewById(R.id.btnInsert);
    update = findViewById(R.id.btnUpdate);
    delete = findViewById(R.id.btnDelete);
    view = findViewById(R.id.btnView);
    search = findViewById(R.id.btnSearch);
    DB = new DBHelper(this);

   
    insert.setOnClickListener(new View.OnClickListener() {

       
        @Override
        public void onClick(View view) {
            String nameTXT = name.getText().toString();
            String contactTXT = contact.getText().toString();
            String dobTXT = dob.getText().toString();

            Boolean checkinsertdata = DB.insertuserdata(nameTXT, contactTXT, dobTXT);
            
            if(checkinsertdata==true)
                Toast.makeText(MainActivity.this, "New Entry Inserted", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(MainActivity.this, "New Entry Not Inserted", Toast.LENGTH_SHORT).show();
        }        });
    

    update.setOnClickListener(new View.OnClickListener() {

       
        @Override
        public void onClick(View view) {
            String nameTXT = name.getText().toString();
            String contactTXT = contact.getText().toString();
            String dobTXT = dob.getText().toString();

            Boolean checkupdatedata = DB.updateuserdata(nameTXT, contactTXT, dobTXT);
          
            if(checkupdatedata==true)
                Toast.makeText(MainActivity.this, "Entry Updated", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(MainActivity.this, "New Entry Not Updated", Toast.LENGTH_SHORT).show();
        }        });

    
    delete.setOnClickListener(new View.OnClickListener() {

       
        @Override
        public void onClick(View view) {
            String nameTXT = name.getText().toString();
            Boolean checkudeletedata = DB.deletedata(nameTXT);
           
            if(checkudeletedata==true)
                Toast.makeText(MainActivity.this, "Entry Deleted", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(MainActivity.this, "Entry Not Deleted", Toast.LENGTH_SHORT).show();
        }        });

    
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Cursor res = DB.getdata();
            if(res.getCount()==0){
                Toast.makeText(MainActivity.this, "No Entry Exists", Toast.LENGTH_SHORT).show();
                return;
            }

          
            StringBuffer buffer = new StringBuffer();
            while(res.moveToNext()){
                buffer.append("Name :"+res.getString(0)+"\n");
                buffer.append("Contact :"+res.getString(1)+"\n");
                buffer.append("Date of Birth :"+res.getString(2)+"\n\n");
            }
            
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setCancelable(true);
            builder.setTitle("User Entries");
            builder.setMessage(buffer.toString());
            builder.show();
        }        });


  }

}

DBHelper.java:

package com.example.sqliteapplication;

import ...

public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {

    super(context, "Userdata.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase DB) {
    
    DB.execSQL("create Table Userdetails(name TEXT primary key," +
            "contact TEXT, dob TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase DB, int oldVersion, int newVersion) {
    DB.execSQL("drop Table if exists Userdetails");
}


public Boolean insertuserdata(String name, String contact, String dob) {
    
    SQLiteDatabase DB = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put("name", name);
    contentValues.put("contact", contact);
    contentValues.put("dob", dob);


    long result = DB.insert("Userdetails",
            null, contentValues);
    
    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

public Boolean updateuserdata(String name, String contact, String dob) {
    
    SQLiteDatabase DB = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put("contact", contact);
    contentValues.put("dob", dob);
    
    Cursor cursor = DB.rawQuery(
            "Select * from Userdetails where name = ?", new String[]{name});

    
    if (cursor.getCount() > 0) {
   

        long result = DB.update("Userdetails",
                contentValues, "name=?",
                new String[]{name});
        
        if (result == -1) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }

}

public Boolean deletedata(String name) {
    
    SQLiteDatabase DB = this.getWritableDatabase();

    
    Cursor cursor = DB.rawQuery(
            "Select * from Userdetails where name = ?", new String[]{name});

   
    if (cursor.getCount() > 0) {
       

        long result = DB.delete("Userdetails", "name=?",
                new String[]{name});
      
        if (result == -1) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}


public Cursor getdata () {
    
    SQLiteDatabase DB = this.getWritableDatabase();

    
    Cursor cursor = DB.rawQuery(
            "Select * from Userdetails ", null);
    return cursor;

}

}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".MainActivity">

<TextView
    android:id="@+id/texttitle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Please enter details below"
    android:textSize="24dp"
    android:layout_marginTop="20dp"
    />

<EditText
    android:id="@+id/name"
    android:hint="Name"
    android:textSize="24dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/texttitle"
    android:inputType="textPersonName"
    />

<EditText
    android:id="@+id/contact"
    android:hint="Contact"
    android:textSize="24dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/name"
    android:inputType="number"
    />

<EditText
    android:id="@+id/dob"
    android:hint="Date of Birth"
    android:textSize="24dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/contact"
    android:inputType="number"
    />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/btnInsert"
    android:textSize="24dp"
    android:text="Insert New Data"
    android:layout_marginTop="30dp"
    android:layout_below="@+id/dob"
    />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/btnUpdate"
    android:textSize="24dp"
    android:text="Update Data"
    android:layout_below="@+id/btnInsert"
    />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/btnDelete"
    android:textSize="24dp"
    android:text="Delete Data"
    android:layout_below="@+id/btnUpdate"
    />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/btnView"
    android:textSize="24dp"
    android:text="View Data"
    android:layout_below="@+id/btnDelete"
    />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/btnSearch"
    android:textSize="24dp"
    android:text="Search Data"
    android:layout_below="@+id/btnView"
    />


</RelativeLayout>

对于一些不好的解释/没有意义的东西,我提前道歉,我才几周时间,肯定有很多东西要学!谢谢

【问题讨论】:

  • 您如何使用搜索按钮?

标签: java android sqlite android-sqlite


【解决方案1】:

您可以修改getdata(),使其将名称或您搜索的名称的一部分作为参数:

public Cursor getdata(String name) {
    SQLiteDatabase DB = this.getWritableDatabase();
    String sql = "Select * from Userdetails";
    String[] selectionArgs = null;
    if (name != null) {
        sql += " where name LIKE '%' || ? || '%'";
        selectionArgs = new String[] {name};
    }
    return DB.rawQuery(sql, selectionArgs);
}

您还应该在按钮view 的侦听器中修改对getdata() 的调用以传递null,以便您获得表格的所有行:

Cursor res = DB.getdata(null);

然后你为按钮search创建监听器:

search.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String searchName = name.getText().toString().trim();
        if (searchName.length() == 0) return;

        Cursor res = DB.getdata(searchName);
        if(res.getCount()==0){
            Toast.makeText(MainActivity.this, "No Entry Exists", Toast.LENGTH_SHORT).show();
            return;
        }

        StringBuffer buffer = new StringBuffer();
        while(res.moveToNext()){
            buffer.append("Name :"+res.getString(0)+"\n");
            buffer.append("Contact :"+res.getString(1)+"\n");
            buffer.append("Date of Birth :"+res.getString(2)+"\n\n");
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setCancelable(true);
        builder.setTitle("User Entries");
        builder.setMessage(buffer.toString());
        builder.show();
    }
});

请注意,在插入、更新、删除行之前无需查询表。
您可以执行您想要的操作,然后检查方法insert()update()delete() 的结果以确定它是否成功。
请记住,如果不成功,只有 insert() 返回 -1
update()delete() 返回受影响(更新/删除)的行数。

所以,我会这样写代码:

package com.example.sqliteapplication;

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

public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(Context context) {
        super(context, "Userdata.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase DB) {
        DB.execSQL("create Table Userdetails(name TEXT primary key, contact TEXT, dob TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase DB, int oldVersion, int newVersion) {
        DB.execSQL("drop Table if exists Userdetails");
    }

    public Boolean insertuserdata(String name, String contact, String dob) {
        SQLiteDatabase DB = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", name);
        contentValues.put("contact", contact);
        contentValues.put("dob", dob);
        long result = DB.insert("Userdetails", null, contentValues);
        return (result != -1);
    }

    public Boolean updateuserdata(String name, String contact, String dob) {
        SQLiteDatabase DB = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("contact", contact);
        contentValues.put("dob", dob);
        long result = DB.update("Userdetails", contentValues, "name = ?", new String[]{name});
        return (result > 0);
    }

    public Boolean deletedata(String name) {
        SQLiteDatabase DB = this.getWritableDatabase();
        long result = DB.delete("Userdetails", "name = ?", new String[]{name});
        return (result > 0);
    }

    public Cursor getdata(String name) {
        SQLiteDatabase DB = this.getWritableDatabase();
        String sql = "Select * from Userdetails";
        String[] selectionArgs = null;
        if (name != null) {
            sql += " where name LIKE '%' || ? || '%'";
            selectionArgs = new String[] {name};
        }
        return DB.rawQuery(sql, selectionArgs);
    }
}

对于活动类:

package com.example.sqliteapplication;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText name, contact, dob;
    Button insert, update, delete, view, search;
    DBHelper DB;

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

        name = findViewById(R.id.name);
        contact = findViewById(R.id.contact);
        dob = findViewById(R.id.dob);
        insert = findViewById(R.id.btnInsert);
        update = findViewById(R.id.btnUpdate);
        delete = findViewById(R.id.btnDelete);
        view = findViewById(R.id.btnView);
        search = findViewById(R.id.btnSearch);
        DB = new DBHelper(this);

        insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String nameTXT = name.getText().toString().trim();
                String contactTXT = contact.getText().toString().trim();
                String dobTXT = dob.getText().toString().trim();

                Boolean checkinsertdata = DB.insertuserdata(nameTXT, contactTXT, dobTXT);

                if(checkinsertdata==true)
                    Toast.makeText(MainActivity.this, "New Entry Inserted", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(MainActivity.this, "New Entry Not Inserted", Toast.LENGTH_SHORT).show();
            }
        });

        update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String nameTXT = name.getText().toString().trim();
                String contactTXT = contact.getText().toString().trim();
                String dobTXT = dob.getText().toString().trim();

                Boolean checkupdatedata = DB.updateuserdata(nameTXT, contactTXT, dobTXT);

                if(checkupdatedata==true)
                    Toast.makeText(MainActivity.this, "Entry Updated", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(MainActivity.this, "New Entry Not Updated", Toast.LENGTH_SHORT).show();
            }
        });

        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String nameTXT = name.getText().toString().trim();
                Boolean checkudeletedata = DB.deletedata(nameTXT);

                if(checkudeletedata==true)
                    Toast.makeText(MainActivity.this, "Entry Deleted", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(MainActivity.this, "Entry Not Deleted", Toast.LENGTH_SHORT).show();
            }
        });


        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Cursor res = DB.getdata(null);
                if(res.getCount()==0){
                    Toast.makeText(MainActivity.this, "No Entry Exists", Toast.LENGTH_SHORT).show();
                    return;
                }

                StringBuffer buffer = new StringBuffer();
                while(res.moveToNext()){
                    buffer.append("Name :"+res.getString(0)+"\n");
                    buffer.append("Contact :"+res.getString(1)+"\n");
                    buffer.append("Date of Birth :"+res.getString(2)+"\n\n");
                }

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setCancelable(true);
                builder.setTitle("User Entries");
                builder.setMessage(buffer.toString());
                builder.show();
            }
        });

        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String searchName = name.getText().toString().trim();
                if (searchName.length() == 0) return;

                Cursor res = DB.getdata(searchName);
                if(res.getCount()==0){
                    Toast.makeText(MainActivity.this, "No Entry Exists", Toast.LENGTH_SHORT).show();
                    return;
                }

                StringBuffer buffer = new StringBuffer();
                while(res.moveToNext()){
                    buffer.append("Name :"+res.getString(0)+"\n");
                    buffer.append("Contact :"+res.getString(1)+"\n");
                    buffer.append("Date of Birth :"+res.getString(2)+"\n\n");
                }

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setCancelable(true);
                builder.setTitle("User Entries");
                builder.setMessage(buffer.toString());
                builder.show();
            }
        });
    }
} 

【讨论】:

  • 这很有道理,帮我解决了,谢谢!我只是在摸索这样一个解决方案的表面,但现在我看到你是如何解决它的,我显然错过了一些重要的部分!
【解决方案2】:

在 DBHelper.java 中添加:

public Cursor getDataByName(String name){
    SQLiteDatabase db = this.getWritableDatabase();
    return db.rawQuery("SELECT * FROM Userdetails WHERE name LIKE '%"+name+"'%", null);
}

在 MainActivity.java 中:

添加一个新的全局EditText:

EditText name, contact, dob, **search**;

onCreate() 添加:

search.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        searchInDatabase();
    }
}

在 MainActivity.java 的某个地方添加这个新方法。

private void searchInDatabaseByName(){
    Cursor res = DB.getDataByName(name.getText().toString());
    if(res.getCount()==0){
        Toast.makeText(MainActivity.this, "No Entry Exists", Toast.LENGTH_SHORT).show();
        return;
    }

    Cursor res = DB.getdata();
    if(res.getCount()==0){
        Toast.makeText(MainActivity.this, "No Entry Exists", Toast.LENGTH_SHORT).show();
        return;
    }

  
    StringBuffer buffer = new StringBuffer();
    while(res.moveToNext()){
        buffer.append("Name :"+res.getString(0)+"\n");
        buffer.append("Contact :"+res.getString(1)+"\n");
        buffer.append("Date of Birth :"+res.getString(2)+"\n\n");
    }
    
    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setCancelable(true);
    builder.setTitle("User Entries");
    builder.setMessage(buffer.toString());
    builder.show();
}

现在解释一下:

在 sqlite 中,您可以使用 LIKE 关键字查询数据。例如,为了找到所有名称为“Bob”的行,您可以查询

SELECT * FROM Userdetails WHERE name LIKE '%Bob%'

然后,返回的游标将包含所有名为 Bob 的行。

然后我们添加了另一个 EditText 变量进行搜索(您还需要将它添加到 main_acitivity.xml)。

现在您可以使用它输入要搜索的名称,然后单击“搜索”按钮,该按钮将调用“searchInDatabaseByName”方法,该方法与“查看”按钮完全相同,但只是简单转到我们的新 DBHelper 方法“getDataByName”。

请注意,建议让 DBHelper 完成所有获取实际数据的工作(这意味着它会获取光标并解析它)

您可能希望为您的用户实体创建一个模型类。 然后数据库方法将返回一个用户数组列表,稍后将更容易在 Dialog 中显示(甚至更好,在 ListView 中)

【讨论】:

  • 感谢您的回复!推理和解释对我来说很有意义,但是我没有让它与代码一起工作,起初我收到这个错误:EditText cannot be convert to String Cursor res = DB.getDataByName(name);当尝试建议的解决方法时,将方法“getDataByName”的第一个参数从“String”更改为“EditText”,程序似乎没有显示搜索结果,并且当没有匹配的结果时它最终崩溃。很有可能是我搞砸了导致这种情况发生的事情,但不确定是什么。
  • 哎呀,不是我的坏笑。更改 name.getText().toString()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多