2017-10-23 2 views
0

sqlitedatabase을 사용하여 사용자 이름과 전화 번호를 입력 한 다음 listview에 표시하려고합니다. 데이터베이스에 세부 정보를 삽입하는 데 오류가 없었지만 database이 비어 있는지 확인하면 요소가 listview에 표시 되더라도 비어있는 것으로 표시됩니다.데이터베이스에 요소가 삽입되어 있어도 SqliteDatabse는 빈을 표시합니다.

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 대한 코드는 다음과 주어진다 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 messagetest_buttononClick 메서드 내 것은 항상 database의 항목이 Empty 경우에도 보여줍니다.

누군가 도움을 줄 수 있습니까?

+0

당신이 Gps4Activity.this 동안 대신 MainActivity.this를 사용하여 시도 할 수 있습니다 단지 이것에 대해 확실하지 않다 DatabaseManager를 생성합니다. 내 가정은 지금 당신의 경우입니다. 관리자는 Gps4Activity의 컨텍스트에 존재하므로 MainActivity에서 사용할 수 없습니다. 모든 것이 잘 보였으므로 나는 단지 추측 일 뿐이므로 한 번 시도해보십시오. – Jimmy

+0

오 !! 오타라고해서 유감스럽게 생각합니다. 실제로는 'MainActivity'가 없습니다. 'Gps4Activity'는'MainActivity'처럼 행동합니다. 나는 지금 설명을 편집 할 것이다 –

+0

좋아, @ Xenolion는 당신의 문제를 잡았고, 그/그녀의 대답을 보라. – Jimmy

답변

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! 
    } 
} 
+0

문제를 해결해 주셔서 감사합니다. –

+0

Goodluck ** 해피 코딩! ** – Xenolion

관련 문제