【发布时间】:2018-02-16 01:35:40
【问题描述】:
我是 android 开发的新手,我一直在尝试在预填充的 sqlite android 应用程序中的列表视图上实现搜索过滤器。我尝试按照各种教程开始,但没有成功。
搜索应该过滤学生姓名。
我有以下文件:
DatabaseHelper.java
package com.example.test.test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Log;
class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_PATH = "/data/data/com.example.test.test/databases/"; //MAKE SURE TO UPDATE THIS FOR YOUR ACTIVITY!!!
private static final String DATABASE_NAME= "test.db";
private static final int SCHEMA_VERSION=1;
public static final String TABLE_NAME = "students";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TITLE = "name";
public SQLiteDatabase dbSqlite;
private final Context myContext;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
// check if exists and copy database from resource
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDatabase() {
createDB();
}
private void createDB() {
boolean dbExist = DBExists();
if (!dbExist) {
//By calling this method we create an empty database into the default system location
//We need this so we can overwrite that database with our database.
this.getReadableDatabase();
//now we copy the database we included!
copyDBFromResource();
}
}
private boolean DBExists() {
SQLiteDatabase db = null;
try {
String databasePath = DATABASE_PATH + DATABASE_NAME;
db = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
} catch (SQLiteException e) {
Log.e("SqlHelper", "database not found");
}
if (db != null) {
db.close();
}
return db != null ? true : false;
}
private void copyDBFromResource() {
InputStream inputStream = null;
OutputStream outStream = null;
String dbFilePath = DATABASE_PATH + DATABASE_NAME;
try {
inputStream = myContext.getAssets().open(DATABASE_NAME);
outStream = new FileOutputStream(dbFilePath);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}
outStream.flush();
outStream.close();
inputStream.close();
} catch (IOException e) {
throw new Error("Problem copying database from resource file.");
}
}
public void openDataBase() throws SQLException {
String myPath = DATABASE_PATH + DATABASE_NAME;
dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if (dbSqlite != null)
{
dbSqlite.close();
}
super.close();
}
public Cursor getCursor() {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(TABLE_NAME);
String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE};
//make sure you get your search by string pass correctly!
Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null,null, null, null, "name ASC");
return mCursor;
}
public String getName(Cursor c) {
return(c.getString(1));
}
public Cursor getBrandByID(String id) {
String[] args={id};
return(getReadableDatabase()
.rawQuery("SELECT _id, name FROM students WHERE _id=?",args));
}
}
SelectStudent.java
package com.example.test.test;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.text.TextWatcher;
import android.widget.FilterQueryProvider;
import android.os.Bundle;
import android.support.v7.widget.SearchView;
import android.text.Editable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class SelectStudent extends Activity {
public final static String ID_EXTRA="com.example.test.test._ID";
private DatabaseHelper dbDatabaseHelper = null;
private Cursor ourCursor = null;
private DatabaseAdapter adapter=null;
public void onCreate(Bundle savedInstanceState) {
try
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_students);
ListView myListView = (ListView)findViewById(R.id.myListView);
dbDatabaseHelper=new DatabaseHelper(this);
dbDatabaseHelper.createDatabase();
dbDatabaseHelper.openDataBase();
ourCursor=dbDatabaseHelper.getCursor();
startManagingCursor(ourCursor);
adapter=new DatabaseAdapter(ourCursor);
myListView.setAdapter(adapter);
myListView.setOnItemClickListener(onListClick);
}
catch (Exception e)
{
Log.e("ERROR", "ERROR IN CODE: " + e.toString());
e.printStackTrace();
}
}
private AdapterView.OnItemClickListener onListClick=new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Intent i=new Intent(getBaseContext(), AddCard.class);
i.putExtra(ID_EXTRA, String.valueOf(id));
startActivity(i);
}
};
class DatabaseAdapter extends CursorAdapter {
DatabaseAdapter(Cursor c) {
super(SelectStudent.this, c);
}
@Override
public void bindView(View row, Context ctxt, Cursor c) {
DatabaseHolder holder=(DatabaseHolder)row.getTag();
holder.populateFrom(c, dbDatabaseHelper);
}
@Override
public View newView(Context ctxt, Cursor c, ViewGroup parent) {
LayoutInflater inflater=getLayoutInflater();
View row=inflater.inflate(R.layout.row, parent, false);
DatabaseHolder holder=new DatabaseHolder(row);
row.setTag(holder);
return(row);
}
}
static class DatabaseHolder {
private TextView name=null;
DatabaseHolder(View row) {
name=(TextView)row.findViewById(R.id.studentsText);
}
void populateFrom(Cursor c, DatabaseHelper r) {
name.setText(r.getName(c));
}
}
}
activity_select_students.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/myFilter" android:layout_width="match_parent"
android:layout_height="wrap_content" android:ems="10"
android:hint="Search.....">
</EditText>
<ListView
android:id="@+id/myListView"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_below="@+id/myFilter" />
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/studentsText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#EE0000"
/>
</LinearLayout>
如果能帮助我入门,我们将不胜感激,在此先感谢。
【问题讨论】:
标签: java android sqlite listview filter