Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
在where子句中选择强制关闭android应用程序-sqlite-_Android_Sqlite_Android Studio - Fatal编程技术网

在where子句中选择强制关闭android应用程序-sqlite-

在where子句中选择强制关闭android应用程序-sqlite-,android,sqlite,android-studio,Android,Sqlite,Android Studio,我正试图在sqlite中查询我的数据库,查找android应用程序,但应用程序强制关闭。 我有一个列表视图,显示有关人员的信息。(此信息是通过查询我的整个数据库检索的,该数据库可以正常工作)。现在,当用户单击列表视图中的某个项目时,我正试图打开另一个活动,并在屏幕上预先填充用户信息。 为此,我使用on item click listener中的position变量,然后从我的表中选择所有内容,其中我的表中的ID等于该位置 这是我的数据库助手类 package com.example.assign

我正试图在sqlite中查询我的数据库,查找android应用程序,但应用程序强制关闭。 我有一个列表视图,显示有关人员的信息。(此信息是通过查询我的整个数据库检索的,该数据库可以正常工作)。现在,当用户单击列表视图中的某个项目时,我正试图打开另一个活动,并在屏幕上预先填充用户信息。 为此,我使用on item click listener中的position变量,然后从我的表中选择所有内容,其中我的表中的ID等于该位置

这是我的数据库助手类

package com.example.assignment1;

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

import java.util.ArrayList;

public class databaseManager {
    public static final String DB_NAME = "Friends";
    public static final String DB_TABLE = "friendList";
    public static final int DB_VERSION = 1;
    private static final String CREATE_TABLE = "CREATE TABLE " + DB_TABLE +
            " (code INTEGER PRIMARY KEY AUTOINCREMENT , friendName TEXT NOT NULL, friendAge INTEGER, friendGender TEXT NOT NULL, friendAddress TEXT NOT NULL);";
    private SQLHelper helper;
    private SQLiteDatabase db;
    private Context context;
    public databaseManager(Context c) {
        this.context = c;
        helper = new SQLHelper(c);
        this.db = helper.getWritableDatabase();
    }
    public databaseManager openReadable() throws android.database.SQLException {
        helper = new SQLHelper(context);
        db = helper.getReadableDatabase();
        return this;
    }
    public void close() {
        helper.close();
    }
    public boolean addRow( String name, int age,String gender, String address) {

        ContentValues newFriend = new ContentValues();
        newFriend.put("friendName", name);
        newFriend.put("friendAge", age);
        newFriend.put("friendGender", gender);
        newFriend.put("friendAddress", address);

        db.insert(DB_TABLE,null,newFriend);
        db.close();
        return true;
    }
    
    public ArrayList<String> retrieveRow(int ID){
        ArrayList<String> result = new ArrayList<String>();
        String[] columns = new String[] {"code", "friendName", "friendAge","friendGender","friendAddress"};
        Cursor cursor = db.query(DB_TABLE, columns, "code" + "=" + ID, null, null, null, null);
        cursor.moveToFirst();
        while (cursor.isAfterLast() == false) {
            result.add(cursor.getInt(0) + ", " + cursor.getString(1) + ", " +
                    cursor.getInt(2) + ", "+ cursor.getString(3) + ", "+cursor.getString(4)+ "\n");
            cursor.moveToNext();
        }
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
        return result;
    }
    public ArrayList<String>retrieveRows() {
        ArrayList<String> result = new ArrayList<String>();
        String[] columns = new String[] {"code", "friendName", "friendAge","friendGender","friendAddress"};
        Cursor cursor = db.query(DB_TABLE, columns, null, null, null, null, null);
        cursor.moveToFirst();
        while (cursor.isAfterLast() == false) {
           result.add(cursor.getInt(0) + ", " + cursor.getString(1) + ", " +
                    cursor.getInt(2) + ", "+ cursor.getString(3) + ", "+cursor.getString(4)+ "\n");
            cursor.moveToNext();
        }
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
        return result;
    }

    public class SQLHelper extends SQLiteOpenHelper {
        public SQLHelper (Context c) {
            super(c, DB_NAME, null, DB_VERSION);
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE);
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w("Products table", "Upgrading database i.e. dropping table and re-creating it");
                    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
            onCreate(db);
        }
    }

}

我非常感谢任何帮助

问题是,在填充列表之后,您立即对db对象调用close(),因此,当您稍后尝试重用该对象以获取特定人员的数据时,您会遇到一个错误。设置侦听器后关闭它并不重要,因为稍后会调用侦听器的代码。 请注意错误消息中的以下内容:

java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase

您可以选择在单击列表项时重建数据库对象,然后再次关闭它,或者在应用程序终止时一次性关闭它

package com.example.assignment1;

import android.app.AppComponentFactory;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import org.w3c.dom.Text;

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

public class viewFriends extends AppCompatActivity {
    private ListView listView;
    private databaseManager mydb;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.viewfriendlist);
        listView = (ListView)findViewById(R.id.listView);
        mydb = new databaseManager(viewFriends.this);
        mydb.openReadable();
        displayFriendList();

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String pos = (String)parent.getItemAtPosition(position);
            int poss = position +1;

               Intent intent = new Intent(getApplicationContext(),editOrDelete.class);
               ArrayList<String> result1=mydb.retrieveRow(poss);


                Toast.makeText(getApplicationContext(),pos,Toast.LENGTH_SHORT).show();
               //startActivity(intent);

            }
        });
        mydb.close();



    }

    public void displayFriendList(){
        ArrayList<String> result = mydb.retrieveRows();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, result);
        listView.setAdapter(adapter);
    }



}
 08-21 19:41:39.719 17562-17562/com.example.assignment1 E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.assignment1, PID: 17562
        java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/com.example.assignment1/databases/Friends
            at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
            at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1158)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)
            at com.example.assignment1.databaseManager.retrieveRow(databaseManager.java:53)
            at com.example.assignment1.viewFriends$1.onItemClick(viewFriends.java:42)
            at android.widget.AdapterView.performItemClick(AdapterView.java:310)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042)
            at android.widget.AbsListView$3.run(AbsListView.java:3879)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)