0

I have a problem with database in android. I'd like to collect data from an activity then transfer them to another activity that should show them into a ListView and save them into the DB. The problem is that the app shows only the first item in the listview and I don't know if all data are saved into the DB. When I try to insert a new item, the app probably overrides the first item and shows the newest one. Thanks a lot!

public class HomeActivity extends AppCompatActivity {

Button addPets;

private ListView mainListView;

private ArrayList<User> listUser;
private ArrayAdapter adapter;
private DBAdapter dbAdapter;

DBOpenHelper myDb;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);



    addPets = (Button)findViewById(R.id.add_friends);
    addPets.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent apriRegistraPet = new Intent(HomeActivity.this, RegisterActivity.class);
            startActivity(apriRegistraPet);
        }
    });

    dbAdapter = DBAdapter.getInstance(this);

    mainListView = (ListView)findViewById(R.id.elenco_pets);

    listUser = new ArrayList<User>();
    adapter = new ArrayAdapter<User>(this, android.R.layout.simple_list_item_1, listUser);

    mainListView.setAdapter(adapter);
    mainListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            onLongClick(position, mainListView);
            return true;
        }
    });

}



private void addNewItem(User user) {

    long idx = dbAdapter.insertUser(user);
    user.setId(idx);

    listUser.add(0, user);
    adapter.notifyDataSetChanged();


}

private void onLongClick(final int position, final ListView listView){
    User user = (User)listView.getItemAtPosition(position);
    Toast.makeText(getApplicationContext(), "Deleted Item", Toast.LENGTH_LONG).show();

    if(!dbAdapter.deleteUser(user)){
        return;
    }

    listUser.remove(user);
    adapter.notifyDataSetChanged();
}

@Override
protected void onResume() {

    super.onResume();
    dbAdapter.open();
    fillData();


    Bundle extras = getIntent().getExtras();
    if(extras != null){
        String nome = extras.getString("Nome");
        String razza = extras.getString("Razza");
        String sesso = extras.getString("Sesso");
        User user = new User(0, nome, razza, sesso, 10, 2000);
        addNewItem(user);

    }


}

public void fillData(){
    Cursor cursor = dbAdapter.getAllEntries();
    this.listUser.clear();

    cursor.moveToFirst();
    while(!cursor.isAfterLast()){

        long idx = cursor.getLong(cursor.getColumnIndex(DBContract.AttributiRegistrazione._ID));
        String nome = cursor.getString(cursor.getColumnIndex(DBContract.AttributiRegistrazione.NOME));
        String razza = cursor.getString(cursor.getColumnIndex(DBContract.AttributiRegistrazione.RAZZA));
        String sesso = cursor.getString(cursor.getColumnIndex(DBContract.AttributiRegistrazione.SESSO));
        this.listUser.add(0, new User(idx, nome, razza, sesso, 10, 2000));
        cursor.moveToNext();

    }

    cursor.close();
    adapter.notifyDataSetChanged();
}

And this is Register Activity

public class RegisterActivity extends AppCompatActivity {

ImageButton settaImmagine;
String imgDecodableString;

Spinner sprazza;
Spinner spsesso;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    //Clicco V e mette nella listview
    ImageButton salva = (ImageButton)findViewById(R.id.button_salva);
    salva.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final EditText editText = (EditText)findViewById(R.id.name);
            sprazza = (Spinner)findViewById(R.id.spinner_razza);
            String razza = sprazza.getSelectedItem().toString();
            spsesso = (Spinner)findViewById(R.id.spinner_sesso);
            String sesso = spsesso.getSelectedItem().toString();

            Intent resultIntent = new Intent(RegisterActivity.this, HomeActivity.class);
            resultIntent.putExtra("Nome", editText.getText().toString());
            resultIntent.putExtra("Razza", razza);
            resultIntent.putExtra("Sesso", sesso);

            startActivity(resultIntent);
        }
    });

DBAdapter class;

public class DBAdapter {

private static final String TAG = "DBAdapter";
private static DBAdapter dbAdapter;
private static DBOpenHelper dbOpenHelper;
private SQLiteDatabase db;

public synchronized static DBAdapter getInstance(Context context){

    if(dbAdapter==null) {
        dbAdapter = new DBAdapter(context.getApplicationContext());
    }
    return dbAdapter;

}

private DBAdapter(Context context) {dbOpenHelper = DBOpenHelper.getInstance(context);}

public DBAdapter open() throws SQLException{
    try{
        db = dbOpenHelper.getWritableDatabase();
    }
    catch (SQLException e){
        Log.e(TAG, e.toString());
        throw e;
    }
    return this;
}

public void close() {
    db.close();
}


public long insertUser (User user){

    Log.v(TAG, "Inserisci un User to DB: " +user.getNome());
    long idx = db.insert(DBContract.AttributiRegistrazione.NOME_TABELLA, null, user.getAsContentValue());
    user.setId(idx);
    Log.v(TAG, "Added user with ID: "+idx);
    return idx;

}

public boolean deleteUser (User user){

    Log.v(TAG, "Removing User: " + user.getClass());
    return db.delete(DBContract.AttributiRegistrazione.NOME_TABELLA,
            DBContract.AttributiRegistrazione.NOME + "=" + user.getNome(), null) == 1;
}

public boolean deleteUser(String name){
    Log.v(TAG, "Removing user: " + name);
    return db.delete(DBContract.AttributiRegistrazione.NOME_TABELLA,
            DBContract.AttributiRegistrazione.NOME + "=" + name, null) == 1;
}

public Cursor getAllEntries(){
    return db.query(DBContract.AttributiRegistrazione.NOME_TABELLA,
            null, null, null, null, null, null);
}

ERROR LOG

E/SQLiteLog: (1) table Registrazione has no column named Anno_nascita 04-10 13:57:21.142 10175-10175/com.b.uzzo.snappaw E/SQLiteDatabase: Error inserting Anno_nascita=2000 Peso=10.0 Nome=simone Sesso=Maschio Razza=Akita Inu
android.database.sqlite.SQLiteException: table Registrazione has no column named Anno_nascita (code 1): , while compiling: INSERT INTO Registrazione(Anno_nascita,Peso,Nome,Sesso,Razza) VALUES (?,?,?,?,?)
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1500)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1373)
    at com.b.uzzo.snappaw.DBAdapter.insertUser(DBAdapter.java:49)
    at com.b.uzzo.snappaw.HomeActivity.addNewItem(HomeActivity.java:105)
    at com.b.uzzo.snappaw.HomeActivity.onResume(HomeActivity.java:140)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269)
    at android.app.Activity.performResume(Activity.java:6770)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3522)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3591)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2825)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1542)
    at android.os.Handler.dispatchMessage(Handler.java:110)
    at android.os.Looper.loop(Looper.java:203)
    at android.app.ActivityThread.main(ActivityThread.java:6319)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1085)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:946)

But it's created in DBContract class

public class DBContract {

static final String DB_NAME = "RegistrazioneCuccioli";
static final int DB_VERSION = 1;

static abstract class AttributiRegistrazione implements BaseColumns{

    static final String NOME_TABELLA = "Registrazione";
    static final String NOME = "Nome";
    static final String RAZZA = "Razza";
    static final String SESSO = "Sesso";
    static final String PESO = "Peso";
    static final String ANNO_NASCITA = "Anno_nascita";

}

}

1 Answers1

0

In fillData method of HomeActivity class, You are adding data into Arraylist using list.add(0,new User()),which add your data into 0 index, that is cause of your problem. You should have to call list.add(user)

Try this updated Code:

public void fillData(){
 Cursor cursor = dbAdapter.getAllEntries();
 this.listUser.clear();

 if (cursor.moveToFirst()){
  do {
    long idx = cursor.getLong(cursor.getColumnIndex(DBContract.AttributiRegistrazione._ID));
    String nome = cursor.getString(cursor.getColumnIndex(DBContract.AttributiRegistrazione.NOME));
    String razza = cursor.getString(cursor.getColumnIndex(DBContract.AttributiRegistrazione.RAZZA));
    String sesso = cursor.getString(cursor.getColumnIndex(DBContract.AttributiRegistrazione.SESSO));
    User user = new User(idx, nome, razza, sesso, 10, 2000);
    this.listUser.add(user);
    }while(cursor.moveToNext());

}

cursor.close();
adapter.notifyDataSetChanged();}
immodi
  • 607
  • 1
  • 6
  • 21
  • Try [this solution to retrieve data from cursor](https://stackoverflow.com/questions/2810615/how-to-retrieve-data-from-cursor-class?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa) – immodi Apr 10 '18 at 10:03
  • Thanks for the help, but the updated code gives the same problems of mine – Sab Biuzzino Apr 10 '18 at 10:37
  • Did you debug your code? What is size of your Arraylist for User? – immodi Apr 10 '18 at 10:40
  • You are doing same in **addNewItem** method of HomeActivity class. Please correct it – immodi Apr 10 '18 at 10:49
  • i don't understand what did you mean with "doing same in addNewItem method" – Sab Biuzzino Apr 10 '18 at 12:09
  • @SabBiuzzino, show your error logs in your question – immodi Apr 10 '18 at 12:10
  • "doing same in addNewItem method" means **listUser.add(0, user);** It's always add object in 0 index of Arraylist. Replace it with **listUser.add(user)** – immodi Apr 10 '18 at 12:13
  • @SabBiuzzino, your error logs says "table Registrazione has no column named Anno_nascita" means you have to create column first or if you have created column then reinstall application. – immodi Apr 10 '18 at 12:25
  • It's created in the DBContract class – Sab Biuzzino Apr 10 '18 at 12:30
  • Did you check in application database? – immodi Apr 10 '18 at 12:36
  • How should I do it? – Sab Biuzzino Apr 10 '18 at 12:50
  • Go to **Device File Explorer -> Select any emulator -> data -> data -> your application package name -> databases** and right click on database file then save as in directory and open it on sqlite browser – immodi Apr 10 '18 at 13:02
  • Running with the adb and the shell it's says that "databases not found" – Sab Biuzzino Apr 10 '18 at 13:28
  • okay..[refer this solution](https://stackoverflow.com/a/20559136/2264534) and even if you couldn't found database then database must not be created – immodi Apr 10 '18 at 13:33
  • Ok, i found database and table created, but he create a column named: Anno instead of "AnnoNascita" – Sab Biuzzino Apr 10 '18 at 14:01
  • @SabBiuzzino, It's strange. Okay please try to rename column name with "AnnoNascita" instead of "Anno_nascita" – immodi Apr 11 '18 at 05:18
  • If my answer is helped you to resolved your issue then please mark as corrected answer and Upvote my answer – immodi Apr 11 '18 at 06:55
  • No, i've tried also with AnnoNascita but still same error – Sab Biuzzino Apr 11 '18 at 09:53
  • As per your code, all things getting weird. I suggest you to refer this [database demo](https://www.androidhive.info/2011/11/android-sqlite-database-tutorial/) – immodi Apr 11 '18 at 10:05