У меня есть база данных (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());
}
Как япроверил что?.... = rЯ использовал такие сообщения, как: Log.d(" ","before the cursor")
-перед этим циклом, а также Log.d(" ","after the cursor")
.
Теперь первое всегда отображается, но второе никогда не отображается.
Кто-то знает, в чем проблема? Потому что, если я пытаюсь навести курсор на данные вне этого потока, все работает просто отлично - данные отображаются .... и я делаю то же самое!
Другое дело, что если я использую оператор if(!c.moveToFirst())
, программа входит в цикл, и отображается второе сообщение, но я получаю эту ошибку в 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);
}
}