在 SQLite 数据库中搜索和显示条目

Search and display entries in SQLite Database

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

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>

提前抱歉可能有些不好 explanations/something 没有意义,我才几周就开始了,肯定有很多东西要学!谢谢

在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%'

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

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

现在您可以使用它来输入您要搜索的名称,然后单击 'search' 按钮,这在 return 中将调用 'searchInDatabaseByName' 方法,该方法执行准确的操作与您的 'view' 按钮相同,只是转到我们新的 DBHelper 方法 'getDataByName'.

请注意,建议让 DBHelper 完成所有获取实际数据的工作(这意味着它将获取游标并对其进行解析)

您可能想要为您的用户实体创建一个模型 class。 然后数据库方法将 return 一个用户数组列表,稍后将更容易显示在对话框中(或者更好,在 ListView 中)

您可以修改 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 这样您就可以得到 [=47 的所有行=]:

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

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

所以,我会这样写代码:

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

和 activity class:

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