1

GPSデータ(経度と緯度)を含むテーブルを含むデータベース(SQLite)があります!データ全体にカーソルを取得して表示したので、データベースが存在し、データが含まれていると確信しています画面上。

これで、私のアプリはデータベースに書き込んでデータを表示するよりも少し大きくなるはずです。ソケットを介して別のアプリにデータを送信する必要があります。

そのために、他のアプリに接続してデータベースを開き、データを読み取って他のアプリに送信する別のスレッドを作成しました。

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());

                     }

どのように私はそれをテストしましたか?.... = r次のようなメッセージを使用しました: Log.d(" ","before the cursor")-そのループの前および Log.d(" ","after the cursor")

これで、最初のものは常に表示されますが、2番目のものは表示されません。

誰かが問題を知っていますか?このスレッドの外側のデータにカーソルを合わせようとすると、すべてが正常に機能します-データが表示されます....そして私は同じことをしています!

もう1つのことは、ステートメントを使用すると if(!c.moveToFirst())、プログラムがループに入り、2番目のメッセージが表示されますが、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

..それは何ですか?...........それで、そのカーソルで私の間違いなくユニークな問題ですが、何ですか?

よろしくお願いします!!!詳細はこちら!!!

アップデート:

パブリッククラス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);
}

}

4

1 に答える 1

1

c.moveToFirst()がfalseを返す場合、カーソルは空のようです。クエリが正しく、データベースが開かれていることなどを確認してください。そのコードの一部を投稿してください。

よろしく、まで

于 2011-04-19T20:43:47.630 に答える