获取游标时出现问题!

时间:2011-04-19 20:16:37

标签: android multithreading cursor logcat

我有一个数据库(SQLite),其中包含一个包含GPS数据的表格:经度和纬度!我确信数据库存在并包含数据,因为我已经成功获取了整个数据的光标而且我我把它显示在屏幕上。

现在,我的应用程序应该比在数据库中写入并显示数据要大得多。我应该通过套接字将数据发送到另一个应用程序。

为此,我创建了另一个连接到另一个应用程序的线程,打开数据库并读取数据并将其发送到另一个应用程序。

public class screen1 extends Activity {

      public void onCreate(Bundle savedInstanceState) {

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

    cThread.start();  

     db=new DBAdapter(this);

   }

这是我的ClientThread类;

public 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);
           }
        }
}

现在我遇到的问题就是这个 - 我试图让我的经度和纬度显示出来,但我的程序永远不会进入这个循环:

if(c.moveToFirst()) 
                {

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

                      longitude=c.getString(1);

                     latitude=c.getString(2);


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

                     }

我是如何测试的? .... =我在该循环之前使用了类似:Log.d(" ","before the cursor")的消息以及Log.d(" ","after the cursor")

现在始终显示第一个,但第二个永远不会显示。

有人知道是什么问题吗?因为如果我试图在这个线程之外的数据上获取光标,一切正常 - 数据显示....我正在做同样的事情!

另一件事是,如果我使用语句if(!c.moveToFirst()),程序进入循环并显示第二条消息buut我在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

..这是什么?...........所以那个光标是我唯一的独特问题,但是什么?

提前感谢您的回复!!!我在这里了解更多详情!!!

更新:

public class DBAdapter扩展了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);
}

}

1 个答案:

答案 0 :(得分:1)

如果c.moveToFirst()确实返回false,则光标似乎为空。您确定您的查询是否正确并且数据库是否已打开等。 也许发布一些代码。

最诚挚的问候, 直到