Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用数据库进行搜索_Java_Android - Fatal编程技术网

Java 使用数据库进行搜索

Java 使用数据库进行搜索,java,android,Java,Android,我是初学者,我正在尝试开发简单的android应用程序,但我需要一些帮助。 我有一些按钮,标签等主要活动。按下一个按钮后,我启动第二个活动,SearchActivity,这里是我需要帮助的地方 SearchActivity.java public class SearchActivity extends AppCompatActivity { ListView lv; SearchView sv; ArrayAdapter<String&

我是初学者,我正在尝试开发简单的android应用程序,但我需要一些帮助。 我有一些按钮,标签等主要活动。按下一个按钮后,我启动第二个活动,
SearchActivity
,这里是我需要帮助的地方

SearchActivity.java

public class SearchActivity extends AppCompatActivity {  

      ListView lv;
        SearchView sv;
         ArrayAdapter<String> adapter;
        private ArrayList<String> items = getResults();

        private ArrayList<String> getResults(){
            DatabaseHelper db = new DatabaseHelper(this);
            db.openDatabase();
            ArrayList<String> resultList = new ArrayList<String>();
            Cursor c = db.query(tablename,column names,null,null,null,null,null);
            c.close();
            db.close();
            return  resultList;
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_search);
            lv = (ListView)findViewById(R.id.listview);
            sv = (SearchView)findViewById(R.id.search);
            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items);
            lv.setAdapter(adapter);
            sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    adapter.getFilter().filter(newText);
                    return false;
                }
            });


        }
}
public class DatabaseHelper extends SQLiteOpenHelper
{

     String DB_PATH = null;
        private static String DB_NAME = "dat";
        private SQLiteDatabase myDatabase;
        private final Context myContext;

        public DatabaseHelper(Context context){
            super(context, DB_NAME, null, 10);
            this.myContext = context;
            this.DB_PATH = "/data/data" + context.getPackageName() + "/" + "databases/";
            Log.e("Path 1", DB_PATH);
        }

        public void createDatabase() throws  IOException
        {
            boolean dbExist = checkDatabase();
            if (dbExist) {
            } else {
                this.getReadableDatabase();
                try {
                   copyDatabse();

                } catch (IOException e){
                    throw new Error("Error copying database");
                }
            }

        }

        private boolean checkDatabase()
        {
            SQLiteDatabase checkDB = null;
            try {
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
                } catch (SQLiteException e){
             }
             if(checkDB != null){
                 checkDB.close();
             }
             return checkDB != null ? true : false;
        }

        private  void copyDatabse() throws IOException
        {
            InputStream myInput = myContext.getAssets().open(DB_NAME);
            String outFileName = DB_PATH + DB_NAME;
            OutputStream myOutput =  new FileOutputStream(outFileName);
            byte[] buffer = new byte[10];
            int length;
            while((length = myInput.read(buffer)) > 0){
                myOutput.write(buffer, 0, length);
            }
            myOutput.flush();
            myOutput.close();
            myInput.close();
        }

        public void openDatabase() throws SQLiteException
        {
            String myPath = DB_PATH + DB_NAME;
            myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        }

        @Override
        public synchronized void close(){
            if(myDatabase != null)
                myDatabase.close();
            super.close();
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if(newVersion > oldVersion){
                try{
                    copyDatabse();
                } catch (IOException e){
                    e.printStackTrace();
                }
            }
        }

        public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
        {
            return myDatabase.query(table,columns,null,null,null,null,null);

        }
}
而activity_search.xml只包含一个
SearchView
和一个
ListView

我在这里尝试的是从数据库中加载表数据,并能够使用
SearchView
从中搜索,并在
TextView
中显示结果,它只使用字符串数组,但这样一来,整个
SearchActivity
会导致应用程序崩溃

以下是我的错误:

Caused by: android.database.sqlite.SQLiteException: no such table: Zastavky (code 1): , while compiling: SELECT Nazev FROM Zastavky
                                                                     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                                                                     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                                                                     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                                     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                                     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
                                                                     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
                                                                     at com.example.geote.ap1.SearchActivity.fetchData(SearchActivity.java:52)
                                                                     at com.example.geote.ap1.SearchActivity.onCreate(SearchActivity.java:29)
                                                                     at android.app.Activity.performCreate(Activity.java:5990)
                                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                     at android.os.Looper.loop(Looper.java:135) 
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                                     at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
原因:android.database.sqlite.SQLiteException:没有这样的表:Zastavky(代码1):,编译时:从Zastavky中选择Nazev
位于android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
位于android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
位于android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
位于android.database.sqlite.SQLiteQuery(SQLiteQuery.java:37)
位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
位于android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
位于android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
位于com.example.geote.ap1.SearchActivity.fetchData(SearchActivity.java:52)
位于com.example.geote.ap1.SearchActivity.onCreate(SearchActivity.java:29)
位于android.app.Activity.performCreate(Activity.java:5990)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
在android.app.ActivityThread.access$800(ActivityThread.java:151)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5254)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)


感谢您的回复。

您的课程在哪里?“整个SearchActivity导致应用程序失败”请准确解释“应用程序失败”时会发生什么。当我单击按钮启动SearchActivity时,我收到消息“应用程序已停止”。所以,整个应用程序都失败了。我的课在哪里?java在app>java和xml中,这是一个布局,所以在app>layout中。。当我问你的类在哪里时,我的意思是你发布的树代码都不在一个类中,所以它会给我编译器错误。请编辑代码以包含类。因此,我使用类进行编辑。我检查了代码,显然它无法从资产加载数据库,但我不知道为什么。我添加了我得到的错误。