Reputation: 358
I'm almost new in android developing and I'm going to create a simple database with three field (id, name, phone_number) and two row. Then I want to show these rows into TextView.
My database was created properly, but when I fetch my table rows, I just have one row in my TextView (last row).
Also, each time I run my app, my rows will duplicate into database!!!
For example, first time that I run my app, TextView shows 2, Amir, 0912-2222222
Next time it shows 4, Amir, 0912-2222222
Could you let me know, how can I fix my app ?!
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="58dp"
android:text="@string/hello_world"
android:textSize="25sp" />
</RelativeLayout>
MainActivity.java
package com.example.database_contact;
import java.util.List;
import com.example.database_contact.database.Contact;
import com.example.database_contact.database.DBHelper;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
DBHelper db = new DBHelper(this);
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addRow();
tv = (TextView) findViewById(R.id.tv);
getContacts();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
void addRow ()
{
db.addContact(new Contact("Farshad", "0912-1111111"));
db.addContact(new Contact("Amir", "0912-2222222"));
db.close();
}
void getContacts()
{
List<Contact> contacts = db.getAllContacts();
for (Contact cn : contacts)
{
tv.setText(cn.getId() + ", " + cn.getName() + ", " + cn.getPhone_Number() + " ");
}
}
}
DBHelper.java
package com.example.database_contact.database;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "contact_manager";
private static final int DB_VERSION = 1;
//// TABLE_CONTACT DECLARE
private static final String TABLE_CONTACT = "table_contact";
private static final String ID = "id";
private static final String NAME = "name";
private static final String PHONE_NUMBER = "phone_number";
private static final String CREATE_TABLE_CONTACT =
"CREATE TABLE " + TABLE_CONTACT +
"(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
NAME + " TEXT," +
PHONE_NUMBER + " TEXT" +
")";
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_CONTACT);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT);
db.execSQL(CREATE_TABLE_CONTACT);
}
/**
* All CRUD(Create, Read, Update, Delete) Operations
*/
// Adding new contact
public void addContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(NAME, contact.getName()); // Contact Name
values.put(PHONE_NUMBER, contact.getPhone_Number()); // Contact Phone
// Inserting Row
db.insert(TABLE_CONTACT, null, values);
db.close(); // Closing database connection
}
// Getting single contact
public Contact getContact(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACT, new String[] { ID,
NAME, PHONE_NUMBER }, ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
// return contact
return contact;
}
// Getting All Contacts
public List<Contact> getAllContacts() {
List<Contact> contactList = new ArrayList<Contact>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_CONTACT;
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.setPhone_Number(cursor.getString(2));
// 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(NAME, contact.getName());
values.put(PHONE_NUMBER, contact.getPhone_Number());
// updating row
return db.update(TABLE_CONTACT, values, ID + " = ?",
new String[] { String.valueOf(contact.getId()) });
}
// Deleting single contact
public void deleteContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_CONTACT, ID + " = ?",
new String[] { String.valueOf(contact.getId()) });
db.close();
}
// Getting contacts Count
public int getContactsCount() {
String countQuery = "SELECT * FROM " + TABLE_CONTACT;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
}
Contact.java
package com.example.database_contact.database;
public class Contact {
private int Id;
private String Name;
private String Phone_Number;
public Contact() {}
public Contact (int Id, String Name, String Phone_Number)
{
this.Id = Id;
this.Name = Name;
this.Phone_Number = Phone_Number;
}
public Contact (String Name, String Phone_Number)
{
this.Name = Name;
this.Phone_Number = Phone_Number;
}
public int getId ()
{
return this.Id;
}
public void setId (int Id)
{
this.Id = Id;
}
public String getName ()
{
return this.Name;
}
public void setName (String Name)
{
this.Name = Name;
}
public String getPhone_Number ()
{
return this.Phone_Number;
}
public void setPhone_Number (String Phone_Number)
{
this.Phone_Number = Phone_Number;
}
}
Upvotes: 0
Views: 449
Reputation: 5913
I would suggest you to check details about the Android Lifecycle . Every time the Activity
is created, you are making a call to addRow() which will insert the same data every time the call is made.
for (Contact cn : contacts)
{
tv.setText(cn.getId() + ", " + cn.getName() + ", " + cn.getPhone_Number() + " ");
}
setText() is used to set the Text which is to be displayed in the TextView. You are iterating over the Contacts and effectively overwriting the text displayed in the TextView. So the TextView will finally display text which was set in the last iteration.
Upvotes: 2