我有一个数据库(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);
}
}
答案 0 :(得分:1)
如果c.moveToFirst()确实返回false,则光标似乎为空。您确定您的查询是否正确并且数据库是否已打开等。 也许发布一些代码。
最诚挚的问候, 直到