即使元素插入数据库,SqliteDatabse也显示为空

时间:2017-10-23 14:33:05

标签: java android mysql listview android-sqlite

我正在尝试使用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;
    }

}

listview填充database的活动如下:

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

即使toast message中有条目,onClick test_button方法中的Empty始终会显示database

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

此方法存在逻辑错误

public boolean isEmpty(). 

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

如果行没有退出,为什么返回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!
   }
 }