2014-03-26 42 views
0

我正在使用以下代码来显示数据库的列表视图,但在列表中数据正在重复显示。继承人的代码在列表中重复的数据

public class MainActivity extends Activity { 
private ListView gridView; 
public static ArrayList<String> ArrayofName = new ArrayList<String>(); 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    DatabaseHandler db = new DatabaseHandler(this); 

    /** 
    * CRUD Operations 
    * */ 
    // Inserting Contacts 
    Log.d("Insert: ", "Inserting .."); 
    db.addContact(new Contact("Ravi", "91")); 
    db.addContact(new Contact("Srinivas", "99")); 
    db.addContact(new Contact("Tommy", "95")); 
    db.addContact(new Contact("Karthik", "93")); 

    // Reading all contacts 
    Log.d("Reading: ", "Reading all contacts.."); 
    List<Contact> contacts = db.getAllContacts(); 

    for (Contact cn : contacts) { 
     String log = "Id: " + cn.getID() + " ,Name: " + cn.getName() 
       + " ,Phone: " + cn.getPhoneNumber(); 
     // Writing Contacts to log 
     Log.d("Name: ", log); 

    } 

    db.getAllContacts(); 

    gridView = (ListView) findViewById(R.id.gridView1); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, ArrayofName); 

    gridView.setAdapter(adapter); 

    gridView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 
      Toast.makeText(getApplicationContext(), 
        ((TextView) v).getText(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 
    } 

继承人是另一个类

public class DatabaseHandler extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "contactsManager"; 
private static final String TABLE_CONTACTS = "contacts"; 

// Contacts Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_NAME = "name"; 
private static final String KEY_PH_NO = "phone_number"; 

public DatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
      + KEY_PH_NO + " TEXT" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 
} 

// Upgrading database 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 
    onCreate(db); 
} 

void addContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact.getName()); // Contact Name 
    values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone 
    db.insert(TABLE_CONTACTS, null, values); 
    db.close(); // Closing database connection 
} 

// Getting All Contacts 
public List<Contact> getAllContacts() { 
    List<Contact> contactList = new ArrayList<Contact>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Contact contact = new Contact(); 
      contact.setID(Integer.parseInt(cursor.getString(0))); 
      contact.setName(cursor.getString(1)); 
      contact.setPhoneNumber(cursor.getString(2)); 

      String name = cursor.getString(1) + "\n" + cursor.getString(2); 
      MainActivity.ArrayofName.add(name); 
      // Adding contact to list 
      contactList.add(contact); 
     } while (cursor.moveToNext()); 
    } 

    // return contact list 
    return contactList; 
} 

// Updating single contact 
public int updateContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact.getName()); 
    values.put(KEY_PH_NO, contact.getPhoneNumber()); 

    // updating row 
    return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", 
      new String[] { String.valueOf(contact.getID()) }); 
} 

// Deleting single contact 
public void deleteContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?", 
      new String[] { String.valueOf(contact.getID()) }); 
    db.close(); 
} 

// Getting contacts Count 
public int getContactsCount() { 
    String countQuery = "SELECT * FROM " + TABLE_CONTACTS; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(countQuery, null); 
    cursor.close(); 

    // return count 
    return cursor.getCount(); 
} 

    } 

请告诉我为什么被重复的数据。正如你所看到的,只有四个联系人被添加,但是这个列表显示了这四个重复的约40个联系人。

回答

1

因为每次你运行这个应用程序,你每次都插入值。这就是为什么你需要重复的值。所以在你向数据库插入值之前,要么清除数据库,要么使用共享首选项,并且只在第一次运行时将数据插入到数据库中。

+0

非常感谢。将尝试并告诉结果 –

1

请在我们的代码以下更改:因此

在MainActivity.java 化妆返回类型为void &使功能getAllContacts变化():

在Databasehandler.java 评论以下部分..:

// Reading all contacts 
Log.d("Reading: ", "Reading all contacts.."); 
List<Contact> contacts = db.getAllContacts(); 

for (Contact cn : contacts) { 
    String log = "Id: " + cn.getID() + " ,Name: " + cn.getName() 
      + " ,Phone: " + cn.getPhoneNumber(); 
    // Writing Contacts to log 
    Log.d("Name: ", log); 

}