Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 即使在数据库中插入了元素,SQLiteDatabase也显示为空_Java_Android_Mysql_Listview_Android Sqlite - Fatal编程技术网

Java 即使在数据库中插入了元素,SQLiteDatabase也显示为空

Java 即使在数据库中插入了元素,SQLiteDatabase也显示为空,java,android,mysql,listview,android-sqlite,Java,Android,Mysql,Listview,Android Sqlite,我试图使用sqlitedatabase输入用户名和电话号码,然后在列表视图中显示它们。我在数据库中插入详细信息时没有错误,但是当我检查数据库是否为空时,即使元素显示在列表视图中,它也会显示为空 数据库的代码如下所示: UserDatabase.java public class UserDatabase extends SQLiteOpenHelper { // Table Name public static final String TABLE_NAME = "UserDa

我试图使用
sqlitedatabase
输入用户名和电话号码,然后在
列表视图中显示它们。我在数据库中插入详细信息时没有错误,但是当我检查
数据库是否为空时,即使元素显示在
列表视图中,它也会显示为空

数据库的代码如下所示:

UserDatabase.java

public class UserDatabase extends SQLiteOpenHelper {

    // Table Name
    public static final String TABLE_NAME = "UserDataB";

    // Table columns
    public static final String _ID = "_id";
    public static final String NAME = "name";
    public static final String NUMBER = "phonenumber";

    // Database Information
    static final String DB_NAME = "User_Details.DB";

    // database version
    static final int DB_VERSION = 1;

    // Creating table query
    private static final String CREATE_TABLE = "create table " + TABLE_NAME + "(" + _ID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT NOT NULL, " + NUMBER + " TEXT);";

    public UserDatabase(Context context) {
        super(context, 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) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}
DatabaseManager.java

public class DatabaseManager {

    private UserDatabase dbHelper;

    private Context context;

    private SQLiteDatabase database;

    public DatabaseManager(Context c) {
        context = c;
    }

    public DatabaseManager open() throws SQLException {
        dbHelper = new UserDatabase(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void insert(String name, String number) {
        ContentValues contentValue = new ContentValues();
        contentValue.put(UserDatabase.NAME, name);
        contentValue.put(UserDatabase.NUMBER, number);
        database.insert(UserDatabase.TABLE_NAME, null, contentValue);
    }

    public Cursor fetch() {
        String[] columns = new String[] { UserDatabase._ID, UserDatabase.NAME, UserDatabase.NUMBER };
        Cursor cursor = database.query(UserDatabase.TABLE_NAME, columns, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }

    public boolean isEmpty(){
        SQLiteDatabase db;
        db=new UserDatabase(context).getWritableDatabase();
        Cursor cursor=db.rawQuery("SELECT * FROM "+UserDatabase.TABLE_NAME,null);
        Boolean rowExists;
        if (cursor.moveToFirst()){
            rowExists=true;
        }else {
            rowExists=false;
        }
        return rowExists;
    }

}
public class DetailsActivity extends AppCompatActivity {

    private DatabaseManager manager;
    private ListView listView;
    private SimpleCursorAdapter adapter;

    final String[] from=new String[] {UserDatabase.NAME,UserDatabase.NUMBER};

    final int[] to=new int[] {R.id.nameDisplay,R.id.phoneDisplay};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);

        manager = new DatabaseManager(getApplicationContext());
        manager.open();
        Cursor cursor=manager.fetch();

        listView = (ListView) findViewById(R.id.listViewId);
        listView.setEmptyView(findViewById(R.id.empty));

        adapter = new SimpleCursorAdapter(getApplicationContext(),
        R.layout.row_item, cursor, from, to, 0);
        adapter.notifyDataSetChanged();

        listView.setAdapter(adapter);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(DetailsActivity.this);
                LayoutInflater inflater = DetailsActivity.this.getLayoutInflater();
                final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
                dialogBuilder.setView(dialogView);
                final EditText name = (EditText) dialogView.findViewById(R.id.dialogEditNmID);
                final EditText phone = (EditText) dialogView.findViewById(R.id.dialogEditPhID);

                dialogBuilder.setTitle("Add Details");
                dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (!TextUtils.isEmpty(name.getText().toString()) &&
                            !TextUtils.isEmpty(phone.getText().toString())) {

                            insertData(name.getText().toString(),phone.getText().toString());
                            Cursor cursor=manager.fetch();
                            adapter = new SimpleCursorAdapter(getApplicationContext(),
                                R.layout.row_item, cursor, from, to, 0);
                            adapter.notifyDataSetChanged();
                            listView.setAdapter(adapter);
                        } else {
                            Toast.makeText(getApplicationContext(),
                                "Empty field(s)", Toast.LENGTH_SHORT).show();
                        }

                    }
                });

                dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });

                lertDialog b = dialogBuilder.create();
                b.show();
            }
        });
    }

    public void insertData(String fname,String phnumber){
        manager.insert(fname,phnumber);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}
数据库
填充
列表视图
的活动如下所示:

DetailsActivity.java

public class DatabaseManager {

    private UserDatabase dbHelper;

    private Context context;

    private SQLiteDatabase database;

    public DatabaseManager(Context c) {
        context = c;
    }

    public DatabaseManager open() throws SQLException {
        dbHelper = new UserDatabase(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void insert(String name, String number) {
        ContentValues contentValue = new ContentValues();
        contentValue.put(UserDatabase.NAME, name);
        contentValue.put(UserDatabase.NUMBER, number);
        database.insert(UserDatabase.TABLE_NAME, null, contentValue);
    }

    public Cursor fetch() {
        String[] columns = new String[] { UserDatabase._ID, UserDatabase.NAME, UserDatabase.NUMBER };
        Cursor cursor = database.query(UserDatabase.TABLE_NAME, columns, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }

    public boolean isEmpty(){
        SQLiteDatabase db;
        db=new UserDatabase(context).getWritableDatabase();
        Cursor cursor=db.rawQuery("SELECT * FROM "+UserDatabase.TABLE_NAME,null);
        Boolean rowExists;
        if (cursor.moveToFirst()){
            rowExists=true;
        }else {
            rowExists=false;
        }
        return rowExists;
    }

}
public class DetailsActivity extends AppCompatActivity {

    private DatabaseManager manager;
    private ListView listView;
    private SimpleCursorAdapter adapter;

    final String[] from=new String[] {UserDatabase.NAME,UserDatabase.NUMBER};

    final int[] to=new int[] {R.id.nameDisplay,R.id.phoneDisplay};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);

        manager = new DatabaseManager(getApplicationContext());
        manager.open();
        Cursor cursor=manager.fetch();

        listView = (ListView) findViewById(R.id.listViewId);
        listView.setEmptyView(findViewById(R.id.empty));

        adapter = new SimpleCursorAdapter(getApplicationContext(),
        R.layout.row_item, cursor, from, to, 0);
        adapter.notifyDataSetChanged();

        listView.setAdapter(adapter);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(DetailsActivity.this);
                LayoutInflater inflater = DetailsActivity.this.getLayoutInflater();
                final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
                dialogBuilder.setView(dialogView);
                final EditText name = (EditText) dialogView.findViewById(R.id.dialogEditNmID);
                final EditText phone = (EditText) dialogView.findViewById(R.id.dialogEditPhID);

                dialogBuilder.setTitle("Add Details");
                dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (!TextUtils.isEmpty(name.getText().toString()) &&
                            !TextUtils.isEmpty(phone.getText().toString())) {

                            insertData(name.getText().toString(),phone.getText().toString());
                            Cursor cursor=manager.fetch();
                            adapter = new SimpleCursorAdapter(getApplicationContext(),
                                R.layout.row_item, cursor, from, to, 0);
                            adapter.notifyDataSetChanged();
                            listView.setAdapter(adapter);
                        } else {
                            Toast.makeText(getApplicationContext(),
                                "Empty field(s)", Toast.LENGTH_SHORT).show();
                        }

                    }
                });

                dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });

                lertDialog b = dialogBuilder.create();
                b.show();
            }
        });
    }

    public void insertData(String fname,String phnumber){
        manager.insert(fname,phnumber);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}
test_按钮的
onClick
方法中的
toast消息
始终显示
Empty
,即使
数据库中有条目


有人能帮忙吗?

此方法中存在逻辑错误

public boolean isEmpty(). 
如果行存在,为什么返回
isEmpty()
true?:

若行不存在,为什么返回
false
它现在为空,返回
true
。 因此,简而言之,您返回了
false
而不是
true
true
而不是
false


因此,将代码更改为:(阅读注释了解更多信息!):


我不确定这一点,您可以尝试在创建DatabaseManager时使用MainActivity.this而不是Gps4Activity.this吗。我的假设是,在您的情况下,经理现在存在于Gps4Activity的上下文中,因此在MainActivity中不可用。既然一切看起来都很好,我只是在猜测,那就试试吧。哦!!很抱歉,这是一个输入错误,实际上我没有
main活动
Gps4Activity
的作用与
MainActivity
类似。我现在就编辑描述好了,@Xenolion发现了你的问题,看看他/她的答案。非常感谢你解决了这个问题:)祝你好运!