【问题标题】:SqliteDatabse shows empty even if elements are inserted in the database即使在数据库中插入元素,SqliteDatabse 也显示为空
【发布时间】:2017-10-23 14:33:04
【问题描述】:

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

database 的代码如下:

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;
    }

}

database 填充listview 的活动如下:

DetailsActivity.java

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_buttononClick 方法内的toast message 始终显示Empty,即使database 中有条目也是如此。

有人可以帮忙吗?

【问题讨论】:

  • 我不确定你能不能在创建 DatabaseManager 时尝试使用 MainActivity.this 而不是 Gps4Activity.this。我的假设是你现在的情况,管理器存在于 Gps4Activity 的上下文中,因此在 MainActivity 中不可用。由于每件事看起来都很好,我只是猜测,所以试一试。
  • 哦!对不起,这是一个错字,实际上我没有MainActivityGps4Activity 的行为类似于 MainActivity。我现在将编辑描述
  • 好的,@Xenolion 发现了你的问题,看看他/她的回答。

标签: java android mysql listview android-sqlite


【解决方案1】:

此方法存在逻辑错误

public boolean isEmpty(). 

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

如果行没有退出,为什么返回false 它是空的,现在返回true。 所以简而言之,你返回false 而不是truetrue 而不是false

因此,请将您的代码更改为:阅读评论了解更多信息!):

public boolean isEmpty(){
   SQLiteDatabase db;
   db=new UserDatabase(context).getWritableDatabase();
   Cursor cursor=db.rawQuery("SELECT * FROM "+UserDatabase.TABLE_NAME,null);

   if (cursor.moveToFirst()){
        return false; //because its not empty it has something thats why the cursor moved!
   }else {
        return true; //because it does not have anything and the cursor has nothing so return its really empty!
   }
 }

【讨论】:

  • 非常感谢您解决了这个问题 :)
  • 祝你好运编码愉快!
猜你喜欢
  • 1970-01-01
  • 2018-12-22
  • 2019-05-14
  • 2017-12-25
  • 2016-05-14
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多