开发者

Problem in obtaining a cursor!

I have a database(SQLite) which contains a tabel with GPS data:longitude and latitude!I'm sure that the database exists and contains the data because I've succed to obtain a cursor all over the data and I've displayed it on the screen.

Now,my app should be a little much bigger than writing in a database and display the data.I should send the data through a socket to another app.

For that I've created another thread which connects to the other app and opens the database and reads the data and sends it to the other app.

public class screen1 extends Activity {

      public void onCreate(Bundle savedInstanceState) {

    Thread cThread=new Thread(new ClientThread()); 

    cThread.start();  

     db=new DBAdapter(this);

   }

And here is my ClientThread class;

p开发者_开发问答ublic class ClientThread implements Runnable{

       private PrintWriter out=null;
        public void run()

        {


            try
            {
                InetAddress serverAddr=InetAddress.getByName(serverIpAddress);

             socket=new Socket(serverAddr,ClientPort);

    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);


            Log.d(" ","Clientul is connected");

            }
            catch(UnknownHostException e){
                 System.err.println("Don't know about host");
            }
            catch (IOException e) {
                System.err.println("Couldn't get I/O for the connection to host");
                     }


            try{
             db.createDatabase();
                     db.openDataBase();
                Cursor  c=db.getAllData();
                  Log.d(" ","before the cursor");
             if(c.moveToFirst()) 
                {

                  do{
                      Log.d(" ","after the cursor");

                      longitude=c.getString(1);

                     latitude=c.getString(2);


                     Log.d(longitude,latitude);
                  }while(c.moveToNext());

                     }

             socket.close();
                 }
            catch (IOException e) {
               System.err.println("IOException:  " + e);
           }
        }
}

Now the problem I'm facing is this one-I'm trying to get my longitude and latitude displayed but my program never reaches to get into this loop:

if(c.moveToFirst()) 
                {

                  do{
                      Log.d(" ","after the cursor");

                      longitude=c.getString(1);

                     latitude=c.getString(2);


                     Log.d(longitude,latitude);
                  }while(c.moveToNext());

                     }

How I've tested that? ....=rI've used messages like: Log.d(" ","before the cursor")-before that loop and also Log.d(" ","after the cursor").

Now the first one is always displayed but the second one never is.

Does someone knows what is the problem?Because if I try to get a cursor over the data outside this thread everything works just fine-the data is displayed....and I'm doing the same thing!

Another thing is that if I use the statement if(!c.moveToFirst()) the program enters the loop and the second message is displayed buut I get this error in the logcat:

04-19 07:51:31.450: ERROR/AndroidRuntime(611): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
04-19 07:51:31.450: ERROR/AndroidRuntime(611):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
04-19 07:51:31.450: ERROR/AndroidRuntime(611):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
04-19 07:51:31.450: ERROR/AndroidRuntime(611):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
04-19 07:51:31.450: ERROR/AndroidRuntime(611):     at test.android.screen1$ClientThread.run(screen1.java:96)
04-19 07:51:31.450: ERROR/AndroidRuntime(611):     at java.lang.Thread.run(Thread.java:1096)



android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

..What is that?...........So at that cursor is my definitly uniquee problem,but what?

Thank u in advance for your usefull reply!!!I'm here for further details!!!

UPDATE:

public class DBAdapter extends SQLiteOpenHelper {

public static final String DATABASE_PATH = "data/data/test.android/database";
public static final String DATABASE_NAME = "GPSdata";

public static final String DATABASE_TABLE_1= "route";
public static final String DATABASE_TABLE_2= "car1_data";

public static final String KEY_ROWID_1= "_id";
public static final String KEY_NAMEOFCAR="name_of_car";


public static final String KEY_ROWID_2 = "_id";
public static final String KEY_LONGITUDE= "longitude";
public static final String KEY_LATITUDE = "latitude";
public static final String KEY_ROUTE= "route";




public SQLiteDatabase db;

private final Context myContext;

public DBAdapter(Context context) {
    super(context, DATABASE_NAME, null, 1);
    this.myContext = context;

}

@Override
public void onCreate(SQLiteDatabase db) {
    // check if exists and copy database from resource
    createDB();

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w("SqlHelper", "Upgrading database from version " + oldVersion
            + " to " + newVersion + ", which will destroy all old data");
    onCreate(db);
}

public void createDatabase() {
    createDB();
}

private void createDB() {

    boolean dbExist = DBExists();

    if (!dbExist) {

        copyDBFromResource();

    }

}

private boolean DBExists() {

    SQLiteDatabase db = null;

    try {
        String databasePath = DATABASE_PATH + DATABASE_NAME;
        db = SQLiteDatabase.openDatabase(databasePath, null,
                SQLiteDatabase.OPEN_READWRITE);
        db.setLocale(Locale.getDefault());
        db.setLockingEnabled(true);
        db.setVersion(1);

    } catch (SQLiteException e) {

        Log.e("SqlHelper", "database not found");

    }

    if (db != null) {

        db.close();

    }

    return db != null ? true : false;
}

private void copyDBFromResource() {

    InputStream inputStream = null;
    OutputStream outStream = null;
    String dbFilePath = DATABASE_PATH + DATABASE_NAME;

    try {

        inputStream = myContext.getAssets().open(DATABASE_NAME);

        outStream = new FileOutputStream(dbFilePath);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);
    }

        outStream.flush();
        outStream.close();
        inputStream.close();

    } catch (IOException e) {

        throw new Error("Problem copying database from resource file.");

    }

}

public void openDataBase() throws SQLException {

    String myPath = DATABASE_PATH + DATABASE_NAME;
    db = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READWRITE);

}

@Override
public synchronized void close() {

    if (db != null)
        db.close();

    super.close();

}

public long insertData1(String name_of_car) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_NAMEOFCAR, name_of_car);

    return db.insert(DATABASE_TABLE_1, null, initialValues);
}


public long insertData2(int longitude, int latitude, String route) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_LONGITUDE, longitude);
    initialValues.put(KEY_LATITUDE, latitude);
    initialValues.put(KEY_ROUTE, route);

    return db.insert(DATABASE_TABLE_2, null, initialValues);
}




public Cursor getAllData() 
{
    return db.query(DATABASE_TABLE_2, new String[] {KEY_ROWID_2,KEY_LONGITUDE,KEY_LATITUDE},null,null,null,null,null);
}





public void clearSelections() {
    ContentValues values = new ContentValues();
    values.put(" selected", 0);
    this.db.update(DBAdapter.DATABASE_TABLE_2, values, null, null);
}

}


If c.moveToFirst() does return false your cursor seems to be empty. Are you sure that your query was correct and the database is opened etc. Maybe post some of that code.

Best Regards, Till

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜