android-搜索结果不显示,但已执行SELECT CRUD Sqlite

android-搜索结果不显示,但已执行SELECT CRUD Sqlite,android,sqlite,crud,searchview,Android,Sqlite,Crud,Searchview,您好,我是Android新手,我读过很多教程,但它们是根据代码制作数据库手册的。我想在应用程序中创建一个搜索功能,从sqlite数据库检索数据 我使用MainDIY搜索活动 MainDIY.java import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.databa

您好,我是Android新手,我读过很多教程,但它们是根据代码制作数据库手册的。我想在应用程序中创建一个搜索功能,从sqlite数据库检索数据

我使用MainDIY搜索活动

MainDIY.java

import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

import android.support.design.widget.FloatingActionButton;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;

import java.util.ArrayList;

import timber.log.Timber;


public class MainDIY extends ActionBarActivity implements OnItemClickListener, SearchView.OnQueryTextListener, SearchView.OnCloseListener{
    public static final String  KEY_ID      = "_id";

    private static final int    INSERT_ID   = Menu.FIRST;

    private DBAdapter           db;

    FloatingActionButton fab;
    ListView listview;
    private MyAdapter defaultAdapter;
    private ArrayList<String> daftarData;
    //private ArrayList<String> arraylist=new ArrayList<String>();


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_diy);
        Timber.d("line 37, content activity_diy");
        db = new DBAdapter(this);
        db.open();



        //populate list
        /**
         daftarData = new ArrayList<String>();
         nameList.add("Apples");
         nameList.add("Oranges");
         nameList.add("Grapes");
         nameList.add("Pineapples");
         nameList.add("Mangoes");
         nameList.add("Watermelons");
         nameList.add("Strawberries");
         nameList.add("Bananas");
         nameList.add("Apricots");
         nameList.add("Olives");
         nameList.add("Peaches");
         nameList.add("Jackfruits");

         for (int i = 0; i < 6
         ; i++) {
         daftarData.add("Diana" + i);
         }
         //defaultAdapter = new MyAdapter(MainDIY.this, daftarData);
         //listview.setAdapter(defaultAdapter);
         defaultAdapter = new MyAdapter(DIY.this, nameList);*/



        listview = (ListView) findViewById(R.id.list);

        listview.setEmptyView(findViewById(R.id.empty));




        listview.setOnItemClickListener(this);

        hasilDataTersimpan();

        // float button
        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainDIY.this, AddDIY.class);
                startActivity(intent);
            }
        });


        //List<DataDIY> contacts = db.getAllContact();

        // for (DataDIY cn : contacts) {
        //     String log = "Name: " + cn.getName() ;
        // Writing Contacts to log
        //   Log.d("Name: ", log);
        //}
        // Create the list of names which will be displayed on search
        //for (String id: nameList) {
        // mDbAdapter.createContact(DataDIY);}

    }

   // menampilkan apa yang dicari dan ada di database
   private void hasilPencarian(String query) {
        /**  */

        Cursor cursor = db.searchByInputText((query != null ? query : "@@@@"));



        String[] from = new String[]
                {
                        DBAdapter.COL_NAME
                };
        int[] to = new int[]
                {
                        R.id.txtName
                };Log.d("MainActivity","mencari dan memakai id list item");

        SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.list_adapter, cursor, from, to); // atu list
        Log.d("MainActivity","mencari dan memakai id list item");


        listview.setAdapter(cursorAdapter);


        // TODO Auto-generated method stub
        //Cursor cur = db.getAllContact();



        //listview Click listener
        /** listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

         Cursor cursor = (Cursor) listview.getItemAtPosition(position);

         String selectedName = cursor.getString(cursor.getColumnIndexOrThrow("name"));
         Toast.makeText(DIY.this, selectedName, 0).show();

         listview.setAdapter(defaultAdapter);

         for (int pos = 0; pos < nameList.size(); pos++) {
         if (nameList.get(pos).equals(selectedName)){
         position = pos;
         break;
         }
         }

         Handler handler = new Handler();
         final int finalPosition = position;
         handler.post(new Runnable() {
        @Override
        public void run() {

        listview.setSelection(finalPosition);
        }
        });

         searchView.setQuery("",true);
         }
         }); */


    }


    // menampilkan data" yang tersimpan
    private void hasilDataTersimpan() {
        /** Load database setelah mengklik gambar tugu diy*/
        // TODO Auto-generated method stub
        Cursor cur = db.getAllContact();

        String[] from = new String[]
                {
                        DBAdapter.COL_NAME
                };
        int[] to = new int[]
                {
                        R.id.txtName
                };

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_adapter, cur, from, to);
        listview.setAdapter(adapter);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        // Inflate menu to add items to action bar if it is present.
        inflater.inflate(R.menu.menu_main, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();

        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                if (!newText.isEmpty()){
                    hasilPencarian(newText + "*");
                    Timber.i("text berubah "+newText.toString());
                } else {
                    hasilDataTersimpan();

                    Timber.i("searchview kosong");
                }

                return false;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                hasilPencarian(query + "*");

                Log.d("MainActivity", "mencari di onQueryTextSubmit " + query.toString());
                return false;
            }
        };
        searchView.setOnQueryTextListener(textChangeListener);

        return super.onCreateOptionsMenu(menu);
    }




    @Override
    public void onItemClick(AdapterView<?> arg0, View v, int pos, long id)
    {
        // TODO Auto-generated method stub
        Bundle bundle = new Bundle();
        bundle.putLong(KEY_ID, id);
        Intent intent = new Intent(MainDIY.this, EditDIY.class);
        intent.putExtras(bundle);
        db.close();
        startActivity(intent);

    }

    @Override
    public boolean onClose() {
        Timber.d("onclose");

        return false;

    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        hasilPencarian(query + "*");

        Log.d("MainActivity", "mencari di onQueryTextSubmit " + query.toString());
        return false;
    }



    @Override
    public boolean onQueryTextChange(String newText) {
        if (!newText.isEmpty()){
            hasilPencarian(newText + "*");
            Timber.i("text berubah "+newText.toString());
        } else {
            hasilDataTersimpan();

            Timber.i("searchview kosong");
        }

        return false;
    }

    /** public boolean onQueryTextChange(String newText) {
     if (!newText.isEmpty()){
     hasilPencarian(newText + "*");
     Timber.d("onquerytextchange = "+ newText.toString());
     } else {
     myList.setAdapter(defaultAdapter);
     }

     return false;
     } */

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (db  != null) {
            db.close();
        }
    }


    @Override
    protected void onNewIntent(Intent intent) {
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {

        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //use the query to search
        }
    }


}
DBAdapter.java

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

import java.util.ArrayList;
import java.util.List;

public class DBAdapter
{
    private static final String DB_NAME     = "contact_db";
    private static final int    DB_VER      = 1;

    public static final String  FTS_VIRTUAL_TABLE   = "contact";
    public static final String  COL_ID      = "_id";
    public static final String  COL_NAME    = "name";
    public static final String  COL_TELP    = "telp";

    private static final String TAG         = "ContactDBAdapter";
    private DatabaseHelper      dbHelper;
    private SQLiteDatabase      db;

    private static final String DB_CREATE   = "create virtual table " + FTS_VIRTUAL_TABLE+
        " using fts3 (_id integer primary key, name text not null);";

    private final Context       context;

    private static class DatabaseHelper extends SQLiteOpenHelper
    {

        public DatabaseHelper(Context context)
        {
            // TODO Auto-generated constructor stub
            super(context, DB_NAME, null, DB_VER);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            // TODO Auto-generated method stub
            db.execSQL(DB_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            // TODO Auto-generated method stub
            Log.d(TAG, "upgrade DB");
            db.execSQL("DROP TABLE IF EXISTS " + FTS_VIRTUAL_TABLE);
            onCreate(db);

        }

    }

    public DBAdapter(Context context)
    {
        this.context = context;
        // TODO Auto-generated constructor stub
    }

    public DBAdapter open() throws SQLException
    {
        dbHelper = new DatabaseHelper(context);
        db = dbHelper.getWritableDatabase();
        return this;
    }

    public void close()
    {
        dbHelper.close();
    }

    public void createContact(DataDIY contact)
    {
        ContentValues val = new ContentValues();
        val.put(COL_NAME, contact.getName());
        //val.put(COL_TELP, contact.getTelp());
        db.insert(FTS_VIRTUAL_TABLE, null, val);
    }

    public boolean deleteContact(int id)
    {
        return db.delete(FTS_VIRTUAL_TABLE, COL_ID + "=" + id, null) > 0;
    }

    public Cursor getAllContact()
    {
        return db.query(FTS_VIRTUAL_TABLE, new String[]
                {
                        COL_ID, COL_NAME
                }, null, null, null, null, null);
    }


    public Cursor getSingleContact(int id)
    {
        Cursor cursor = db.query(FTS_VIRTUAL_TABLE, new String[]
                {
                        COL_ID, COL_NAME
                }, COL_ID + "=" + id, null, null, null, null);

        if (cursor != null)
            cursor.moveToFirst();

        return cursor;
    }

    public boolean updateContact(DataDIY contact)
    {
        ContentValues val = new ContentValues();
        val.put(COL_NAME, contact.getName());
        //val.put(COL_TELP, contact.getTelp());

        return db.update(FTS_VIRTUAL_TABLE, val, COL_ID + "=" + contact.getId(), null) > 0;
    }

    public Cursor searchByInputText(String inputText) throws SQLException {

        String query = "SELECT *"
                 +  " from " + FTS_VIRTUAL_TABLE +
                " where " + COL_NAME + " = '" + inputText+"'"  ;

        Log.d("DBAdapter","mencari di searchbyinputtext " + query.toString());

        Cursor mCursor = db.rawQuery(query,null);
        List<String[]> list = new ArrayList<String[]>();


        if (mCursor != null) {
            mCursor.moveToFirst();
        }

        Log.d("DBAdapter","melewati mCursor rawquery");
        return mCursor;

    }

}
导入android.content.ContentValues;
导入android.content.Context;
导入android.database.Cursor;
导入android.database.SQLException;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.util.Log;
导入java.util.ArrayList;
导入java.util.List;
公共类DBAdapter
{
私有静态最终字符串DB\u NAME=“contact\u DB”;
专用静态最终整数DB_VER=1;
公共静态最终字符串FTS_VIRTUAL_TABLE=“contact”;
公共静态最终字符串COL_ID=“_ID”;
公共静态最终字符串COL_NAME=“NAME”;
公共静态最终字符串COL_TELP=“TELP”;
私有静态最终字符串标记=“ContactDBAdapter”;
私有数据库助手dbHelper;
专用数据库数据库;
私有静态最终字符串DB_CREATE=“CREATE virtual table”+FTS_virtual_table+
“使用fts3(_idinteger主键,名称文本不为空);”;
私人最终语境;
私有静态类DatabaseHelper扩展了SQLiteOpenHelper
{
公共数据库助手(上下文)
{
//TODO自动生成的构造函数存根
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db)
{
//TODO自动生成的方法存根
execSQL(db_CREATE);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion)
{
//TODO自动生成的方法存根
Log.d(标签“升级数据库”);
db.execSQL(“如果存在DROP TABLE”+FTS_虚拟_TABLE);
onCreate(db);
}
}
公共DBAdapter(上下文)
{
this.context=上下文;
//TODO自动生成的构造函数存根
}
公共DBAdapter open()引发SQLException
{
dbHelper=新数据库助手(上下文);
db=dbHelper.getWritableDatabase();
归还这个;
}
公众假期结束()
{
dbHelper.close();
}
public void createContact(数据DIY联系人)
{
ContentValues val=新的ContentValues();
val.put(COL_NAME,contact.getName());
//val.put(COL_TELP,contact.getTelp());
db.insert(FTS_虚拟_表,null,val);
}
公共布尔deleteContact(内部id)
{
返回db.delete(FTS_虚拟_表,列ID+“=”+ID,null)>0;
}
公共游标getAllContact()
{
返回db.query(FTS_虚拟_表,新字符串[])
{
列ID,列名称
},null,null,null,null,null,null);
}
公共游标getSingleContact(int id)
{
Cursor Cursor=db.query(FTS_虚拟_表,新字符串[])
{
列ID,列名称
},COL_ID+“=”+ID,null,null,null);
如果(光标!=null)
cursor.moveToFirst();
返回光标;
}
public boolean updateContact(数据DIY联系人)
{
ContentValues val=新的ContentValues();
val.put(COL_NAME,contact.getName());
//val.put(COL_TELP,contact.getTelp());
返回db.update(FTS_VIRTUAL_TABLE,val,COL_ID+“=”+contact.getId(),null)>0;
}
公共游标searchByInputText(字符串inputText)引发SQLException{
String query=“选择*”
+“从”+FTS_虚拟_表+
其中“+COL_NAME+”=“+inputText+””;
Log.d(“DBAdapter”、“mencari di searchbyinputtext”+query.toString());
游标mCursor=db.rawQuery(查询,null);
列表=新的ArrayList();
if(mCursor!=null){
mCursor.moveToFirst();
}
Log.d(“DBAdapter”、“melewati mCursor rawquery”);
返回mCursor;
}
}
告诉我我的方法是否错误。
这里是另一个

尝试卸载应用程序,然后再次将其安装到您的设备中。 因为sqlite数据库中的多次更新仅在应用程序第一次安装到设备中时才会生效。
希望它能起作用。

在SQL查询中,您正在查找精确匹配,但似乎希望结果包含键入的内容。 试着用子句
代替
=

public Cursor searchByInputText(String inputText) throws SQLException {
    String query = "SELECT * FROM "+ FTS_VIRTUAL_TABLE +
            " WHERE" + COL_NAME + " LIKE '%" + inputText + "%'";

我在两端都使用了通配符
%
,但您也可以使用
\
,也可以不使用,这取决于您正在查找的内容。有关详细信息,请参阅。

它可以显示。。它的工作。。 对于想要学习CRUD和搜索SQLite本地数据库的新手,请查看


感谢您回答bfr

仍然为我提供“空数据”,没有错误,但该方法不起作用(不显示或仍然是“空数据”,但没有错误)。。
public Cursor searchByInputText(String inputText) throws SQLException {
    String query = "SELECT * FROM "+ FTS_VIRTUAL_TABLE +
            " WHERE" + COL_NAME + " LIKE '%" + inputText + "%'";