Database connection and data retrieval problem

Problems with WiFi, SQLite ,Bluetooth, WiMax, Proxies, etc...

Database connection and data retrieval problem

Postby hackersapien » Thu Feb 05, 2009 7:49 pm

I'm trying to build a simple app that will access an sqlite database and display users, my code is below:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.android.dbdroid;
  2.  
  3.  
  4.  
  5.  
  6.  
  7. import android.os.Bundle;
  8.  
  9. import android.app.ListActivity;
  10.  
  11. import android.database.sqlite.*;
  12.  
  13. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  14.  
  15. import android.util.Log;
  16.  
  17. import android.database.Cursor;
  18.  
  19. import java.util.ArrayList;
  20.  
  21. import android.widget.SimpleCursorAdapter;
  22.  
  23.  
  24.  
  25. public class DBDroid extends ListActivity {
  26.  
  27.        
  28.  
  29.         private final String USERS_TABLE = "users";
  30.  
  31.         private final String DATABASE_NAME = "DbDroid";
  32.  
  33.         private static final String TAG="DBDroidActivity";
  34.  
  35.         //private static final int DATABASE_VERSION = 1;
  36.  
  37.        
  38.  
  39.        
  40.  
  41.         private CursorFactory cf;
  42.  
  43.         private SQLiteDatabase mydb;
  44.  
  45.         ArrayList<String> results = new ArrayList<String>();
  46.  
  47.        
  48.  
  49.     /** Called when the activity is first created. */
  50.  
  51.     @Override
  52.  
  53.     public void onCreate(Bundle savedInstanceState) {
  54.  
  55.         super.onCreate(savedInstanceState);
  56.  
  57.        
  58.  
  59.         Log.v(TAG,"Creating database");
  60.  
  61.         mydb.openOrCreateDatabase(DATABASE_NAME, cf);
  62.  
  63.         mydb.execSQL("CREATE TABLE IF NOT EXISTS "
  64.  
  65.                                 + USERS_TABLE
  66.  
  67.                                 + " (LastName VARCHAR, FirstName VARCHAR,"
  68.  
  69.                                 + " Country VARCHAR, Age INT(3));");
  70.  
  71.         /* Add two DataSets to the Table. */
  72.  
  73.         mydb.execSQL("INSERT INTO "
  74.  
  75.                                                 + USERS_TABLE
  76.  
  77.                                                 + " (LastName, FirstName, Country, Age)"
  78.  
  79.                                                 + " VALUES ('Gramlich', 'Nicolas', 'Germany', 20);");
  80.  
  81.         mydb.execSQL("INSERT INTO "
  82.  
  83.                                                 + USERS_TABLE
  84.  
  85.                                                 + " (LastName, FirstName, Country, Age)"
  86.  
  87.                                                 + " VALUES ('Doe', 'John', 'US', 34);");
  88.  
  89.         Cursor c = mydb.query(USERS_TABLE, new String[] { "feed_id", "title",
  90.  
  91.                 "url" }, null, null, null, null, null);
  92.  
  93.  
  94.  
  95.                 /* Get the indices of the Columns we will need */
  96.  
  97.                 int firstNameColumn = c.getColumnIndex("FirstName");
  98.  
  99.                 int ageColumn = c.getColumnIndex("Age");
  100.  
  101.                 if(c!=null){
  102.  
  103.                         if(c.moveToFirst()){
  104.  
  105.                                 int i=0;
  106.  
  107.                                 do{
  108.  
  109.                                         i++;
  110.  
  111.                                         String firstName=c.getString(firstNameColumn);
  112.  
  113.                                         int age=c.getInt(ageColumn);
  114.  
  115.                                         String ageColumName = c.getColumnName(ageColumn);
  116.  
  117.                                         results.add("" + i + ": " + firstName
  118.  
  119.                                                         + " (" + ageColumName + ": " + age + ")");
  120.  
  121.                                 }while(c.moveToNext());
  122.  
  123.                         }
  124.  
  125.                 }
  126.  
  127.                 SimpleCursorAdapter users = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, c, null, null);
  128.  
  129.                 setListAdapter(users);
  130.  
  131.                 //setContentView(R.layout.main);
  132.  
  133.     }
  134.  
  135. }
Parsed in 0.042 seconds, using GeSHi 1.0.8.4


When I run the code in eclipse I get the following error within the console:
Code: Select all
[2009-02-05 13:36:14 - DBDroid] emulator-5554 disconnected! Cancelling 'com.android.dbdroid.DBDroid' launch!


I think there's something missing in my code, not sure, I want to keep this code as simple as possible and the notepad example is a bit to complex for me to grasp the basics of database connection and data retrieval.
hackersapien
Freshman
Freshman
 
Posts: 3
Joined: Thu Feb 05, 2009 7:39 pm

Top

Postby MrSnowflake » Fri Feb 06, 2009 9:53 am

That doesn't seem as a coding error, as the connection to the emulator gets closed. Does this happen every time? That's really strange...
User avatar
MrSnowflake
Moderator
Moderator
 
Posts: 1439
Joined: Sat Feb 16, 2008 3:11 pm
Location: Flanders, Belgium

Postby hackersapien » Fri Feb 06, 2009 4:49 pm

I decided to rewrite the code to make it more structured, easier to debug:

DBDroid.java
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.android.dbdroid;
  2.  
  3.  
  4.  
  5. import android.content.Context;
  6.  
  7. import android.database.sqlite.*;
  8.  
  9. import android.util.Log;
  10.  
  11. import android.database.Cursor;
  12.  
  13. import android.database.SQLException;
  14.  
  15. import java.util.ArrayList;
  16.  
  17. import java.util.List;
  18.  
  19.  
  20.  
  21. public class DBDroid {
  22.  
  23.        
  24.  
  25.         private static final String DATABASE_NAME="DroidDB";
  26.  
  27.         private static final String USER_TABLE_NAME="Users";
  28.  
  29.         private static final String CREATE_TABLE_USERS="CREATE TABLE IF NOT EXISTS " + USER_TABLE_NAME + " (LastName VARCHAR, FirstName VARCHAR,Country VARCHAR, Age INT(3));";
  30.  
  31.         private static final int DATABASE_VERSION = 1;         
  32.  
  33.         private SQLiteDatabase myDb=null;
  34.  
  35.        
  36.  
  37.         public DBDroid(Context ctx){
  38.  
  39.                 myDb = ctx.openOrCreateDatabase(DATABASE_NAME, DATABASE_VERSION, null);
  40.  
  41.                 myDb.execSQL(CREATE_TABLE_USERS);
  42.  
  43.          
  44.  
  45.         }
  46.  
  47.        
  48.  
  49.         public void createUsers(){
  50.  
  51.                 myDb.execSQL("INSERT INTO "
  52.  
  53.                                 + USER_TABLE_NAME
  54.  
  55.                                 + " (LastName, FirstName, Country, Age)"
  56.  
  57.                                 + " VALUES ('Gramlich', 'Nicolas', 'Germany', 20);");
  58.  
  59.        myDb.execSQL("INSERT INTO "
  60.  
  61.                                 + USER_TABLE_NAME
  62.  
  63.                                 + " (LastName, FirstName, Country, Age)"
  64.  
  65.                                 + " VALUES ('Doe', 'John', 'US', 34);");
  66.  
  67.         }
  68.  
  69.        
  70.  
  71.         public List<User> getUsers() {
  72.  
  73.                 ArrayList<User> users = new ArrayList<User>();
  74.  
  75.                 try{
  76.  
  77.                         Cursor c = myDb.query(USER_TABLE_NAME, new String[] { "LastName", "FirstName",
  78.  
  79.                         "Country","Age" }, null, null, null, null, null);
  80.  
  81.                         int numRows = c.getCount();
  82.  
  83.                         c.isFirst();
  84.  
  85.                         for (int i = 0; i < numRows; ++i) {
  86.  
  87.                                 User user = new User();
  88.  
  89.                                 user.firstName=c.getString(0);
  90.  
  91.                                 user.lastName=c.getString(1);
  92.  
  93.                                 user.country=c.getString(2);
  94.  
  95.                                 //c.next();
  96.  
  97.                                 c.moveToNext();
  98.  
  99.                         }
  100.  
  101.                 }catch (SQLException e){
  102.  
  103.                         Log.e("DBDroid", e.toString());
  104.  
  105.                 }
  106.  
  107.                 return users;
  108.  
  109.         }
  110.  
  111.        
  112.  
  113.        
  114.  
  115. }
Parsed in 0.038 seconds, using GeSHi 1.0.8.4

User.java
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package com.android.dbdroid;
  3.  
  4.  
  5.  
  6. public class User extends Object {
  7.  
  8.        
  9.  
  10.         public String firstName;
  11.  
  12.         public String lastName;
  13.  
  14.         public String country;
  15.  
  16.         public int age;
  17.  
  18.  
  19.  
  20. }
  21.  
  22.  
Parsed in 0.033 seconds, using GeSHi 1.0.8.4

UsersList.java
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.android.dbdroid;
  2.  
  3.  
  4.  
  5. import java.util.ArrayList;
  6.  
  7. import java.util.List;
  8.  
  9. import android.app.ListActivity;
  10.  
  11. import android.os.Bundle;
  12.  
  13. import android.util.Log;
  14.  
  15. import android.widget.ArrayAdapter;
  16.  
  17.  
  18.  
  19. public class UsersList extends ListActivity{
  20.  
  21.        
  22.  
  23.         private DBDroid droidDB;
  24.  
  25.         private List<User> users;
  26.  
  27.        
  28.  
  29.          public void onCreate(Bundle savedInstanceState) {
  30.  
  31.                  try{
  32.  
  33.                          super.onCreate(savedInstanceState);
  34.  
  35.                          setContentView(R.layout.users_list);
  36.  
  37.                      droidDB = new DBDroid(this);
  38.  
  39.                      fillData();
  40.  
  41.                  }catch(Throwable e){
  42.  
  43.                          Log.e("DBDroid",e.toString());
  44.  
  45.                  }
  46.  
  47.                
  48.  
  49.                
  50.  
  51.          }
  52.  
  53.          private void fillData(){
  54.  
  55.                  List<String> items = new ArrayList<String>();
  56.  
  57.                  users=droidDB.getUsers();
  58.  
  59.                  for(User user:users){
  60.  
  61.                          items.add(user.firstName);
  62.  
  63.                          items.add(user.lastName);
  64.  
  65.                          items.add(user.country);
  66.  
  67.                  }
  68.  
  69.                  ArrayAdapter<String> users =
  70.  
  71.                     new ArrayAdapter<String>(this, R.layout.users_row, items);
  72.  
  73.                 setListAdapter(users);
  74.  
  75.          }
  76.  
  77. }
Parsed in 0.039 seconds, using GeSHi 1.0.8.4


UserManager.java

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.android.dbdroid;
  2.  
  3.  
  4.  
  5.  
  6.  
  7. import android.app.Activity;
  8.  
  9. import android.os.Bundle;
  10.  
  11.  
  12.  
  13. public class UserManager extends Activity {
  14.  
  15.         @Override
  16.  
  17.     public void onCreate(Bundle savedInstanceState) {
  18.  
  19.         super.onCreate(savedInstanceState);
  20.  
  21.         setContentView(R.layout.users_row);
  22.  
  23.  
  24.  
  25.        
  26.  
  27.     }
  28.  
  29. }
Parsed in 0.036 seconds, using GeSHi 1.0.8.4


That loads the emulator fine, but no records are displayed, what I'm i missing?
hackersapien
Freshman
Freshman
 
Posts: 3
Joined: Thu Feb 05, 2009 7:39 pm

Postby hackersapien » Fri Feb 06, 2009 11:22 pm

I rewrote the UserManager.java:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package com.android.dbdroid;
  3.  
  4.  
  5.  
  6.  
  7.  
  8. import android.app.Activity;
  9.  
  10. import android.content.Intent;
  11.  
  12. import android.os.Bundle;
  13.  
  14.  
  15.  
  16.  
  17.  
  18. public class UserManager extends Activity {
  19.  
  20.         @Override
  21.  
  22.     public void onCreate(Bundle savedInstanceState) {
  23.  
  24.         super.onCreate(savedInstanceState);
  25.  
  26.         setContentView(R.layout.users_row);
  27.  
  28.         Intent i = new Intent(getApplicationContext(),
  29.  
  30.                         UsersList.class);
  31.  
  32.         startActivity(i);
  33.  
  34.     }
  35.  
  36. }
  37.  
  38.  
  39.  
  40.  
Parsed in 0.037 seconds, using GeSHi 1.0.8.4


I also modified the DBDroid.java to make sure that database is populated during creation:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package com.android.dbdroid;
  3.  
  4.  
  5.  
  6. import android.content.Context;
  7.  
  8. import android.database.sqlite.*;
  9.  
  10. import android.util.Log;
  11.  
  12. import android.database.Cursor;
  13.  
  14. import android.database.SQLException;
  15.  
  16. import java.util.ArrayList;
  17.  
  18. import java.util.List;
  19.  
  20.  
  21.  
  22. public class DBDroid {
  23.  
  24.        
  25.  
  26.         private static final String DATABASE_NAME="mydroiddatabase.db";
  27.  
  28.         private static final String USER_TABLE_NAME="Users";
  29.  
  30.         private static final String CREATE_TABLE_USERS="CREATE TABLE IF NOT EXISTS " + USER_TABLE_NAME + " (LastName VARCHAR, FirstName VARCHAR,Country VARCHAR, Age INT(3));";
  31.  
  32.         private static final int DATABASE_VERSION = 1;         
  33.  
  34.         private SQLiteDatabase myDb=null;
  35.  
  36.        
  37.  
  38.         public DBDroid(Context ctx){
  39.  
  40.                
  41.  
  42.                 myDb = ctx.openOrCreateDatabase(DATABASE_NAME, 0, null);
  43.  
  44.                 myDb.execSQL(CREATE_TABLE_USERS);
  45.  
  46.                 this.createUsers();
  47.  
  48.         }
  49.  
  50.        
  51.  
  52.         public void createUsers(){
  53.  
  54.                 myDb.execSQL("INSERT INTO "
  55.  
  56.                                 + USER_TABLE_NAME
  57.  
  58.                                 + " (LastName, FirstName, Country, Age)"
  59.  
  60.                                 + " VALUES ('Gramlich', 'Nicolas', 'Germany', 20);");
  61.  
  62.        myDb.execSQL("INSERT INTO "
  63.  
  64.                                 + USER_TABLE_NAME
  65.  
  66.                                 + " (LastName, FirstName, Country, Age)"
  67.  
  68.                                 + " VALUES ('Doe', 'John', 'US', 34);");
  69.  
  70.         }
  71.  
  72.        
  73.  
  74.         public List<User> getUsers() {
  75.  
  76.                 ArrayList<User> users = new ArrayList<User>();
  77.  
  78.                 try{
  79.  
  80.                         Cursor c = myDb.query(USER_TABLE_NAME, new String[] { "LastName", "FirstName",
  81.  
  82.                         "Country","Age" }, null, null, null, null, null);
  83.  
  84.                         int numRows = c.getCount();
  85.  
  86.                         c.isFirst();
  87.  
  88.                         if(c!=null){
  89.  
  90.                                 for (int i = 0; i < numRows; ++i) {
  91.  
  92.                                         User user = new User();
  93.  
  94.                                         user.lastName=c.getString(0);
  95.  
  96.                                         user.firstName=c.getString(1);
  97.  
  98.                                         user.country=c.getString(2);
  99.  
  100.                                         user.age=c.getInt(3);
  101.  
  102.                                         users.add(user);
  103.  
  104.                                         c.moveToNext();
  105.  
  106.                                 }
  107.  
  108.                         }
  109.  
  110.                        
  111.  
  112.                 }catch (SQLException e){
  113.  
  114.                         Log.e("DBDroid", e.toString());
  115.  
  116.                 }
  117.  
  118.                 return users;
  119.  
  120.         }
  121.  
  122.        
  123.  
  124.        
  125.  
  126. }
  127.  
  128.  
Parsed in 0.044 seconds, using GeSHi 1.0.8.4


When I ran the adb shell I accessed the sqlite database and it was populated with the sample records, the only problem is that the list view isn't displaying the records. Please help?
hackersapien
Freshman
Freshman
 
Posts: 3
Joined: Thu Feb 05, 2009 7:39 pm

Postby bit » Thu Feb 12, 2009 4:24 am

As far as wiring up a list, did you look at how it's done here? I'm still learning the Android UI, so I can't tell offhand what may be happening with your program.

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.                
  2.  
  3.                int numRows = c.getCount();
  4.  
  5.                c.isFirst();
  6.  
  7.                if(c!=null){
  8.  
  9.                     for (int i = 0; i < numRows; ++i) {
  10.  
  11.                          User user = new User();
  12.  
  13.                          user.lastName=c.getString(0);
  14.  
  15.                          user.firstName=c.getString(1);
  16.  
  17.                          user.country=c.getString(2);
  18.  
  19.                          user.age=c.getInt(3);
  20.  
  21.                          users.add(user);
  22.  
  23.                          c.moveToNext();
  24.  
  25.                     }
  26.  
  27.                }
Parsed in 0.037 seconds, using GeSHi 1.0.8.4


I may be missing something, but this seems overly complex and prone to sneaky problems.

Have you tried

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.                
  2.  
  3.                       while (c.moveToNext()) {                        
  4.  
  5.                          User user = new User();
  6.  
  7.                          user.lastName=c.getString(0);
  8.  
  9.                          user.firstName=c.getString(1);
  10.  
  11.                          user.country=c.getString(2);
  12.  
  13.                          user.age=c.getInt(3);
  14.  
  15.                          users.add(user);
  16.  
  17.                         }
Parsed in 0.037 seconds, using GeSHi 1.0.8.4


You might want to put a log message in the loop to see if you are getting results back. If not, then there may be a problem with your query. If you do get results, then the problem may be with how you are wiring the results to the list.
bit
Junior Developer
Junior Developer
 
Posts: 19
Joined: Thu Dec 11, 2008 7:30 pm

try this

Postby Dharmendra » Thu Jun 11, 2009 12:31 pm

int numRows = c.getCount();
c.isFirst();
if(c!=null){
for (int i = 0; i < numRows; ++i) {
User user = new User();
user.lastName=c.getString(0);
user.firstName=c.getString(1);
user.country=c.getString(2);
user.age=c.getInt(3);
users.add(user);
c.moveToNext();
}
}

in the above code just replace
c.isFirst(); line with c.moveToFirst(); and code will display list of data in database
Dharmendra
Once Poster
Once Poster
 
Posts: 1
Joined: Thu Jun 11, 2009 12:23 pm

Top

Return to Networking & Database Problems

Who is online

Users browsing this forum: No registered users and 4 guests