gpt4 book ai didi

android - 获取游标的问题!

转载 作者:行者123 更新时间:2023-11-30 04:42:26 25 4
gpt4 key购买 nike

我有一个数据库(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());

}

我是如何测试的? ....=rI've used messages like: Log.d("","before the cursor")-before that loop 以及 Log.d("","after光标").

现在第一个总是显示,但第二个从不显示。

有人知道问题出在哪里吗?因为如果我尝试将光标移到该线程外的数据上,一切正常 - 显示数据......我也在做同样的事情!

另一件事是,如果我使用语句 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

..那是什么?......所以那个光标处是我绝对独特的问题,但是什么?

提前感谢您的有用回复!!!我是来了解更多详情的!

更新:

公共(public)类 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);
}

最佳答案

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

最好的问候,直到

关于android - 获取游标的问题!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5722147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com