2011-04-19 34 views
1

我有一个数据库(SQLite),其中包含一个带GPS数据的tabel:经度和纬度!我确信数据库存在并包含数据,因为我已经成功地获得了遍及数据的光标,而且我已经将其显示在屏幕上。获取游标时出现问题!

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

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

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 

..What是......? ........因此,在那个光标是我最明确的唯一问题,但什么?

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

UPDATE:

公共类将对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

没有人有不小的想法,为什么没有程序进入循环? – adrian 2011-04-19 20:35:44

+1

你的光标是空的。但是我们怎么能猜到为什么?考虑分享你的'db.createDatabase()','db.openDataBase()'和'db.getAllData()'代码。 – ernazm 2011-04-19 21:00:57

+0

我用所有的方法更新了我的答案......但正如我所说的,当我不使用不同的线程来显示数据时,光标工作得很好......它真的......。 – adrian 2011-04-19 21:34:48

回答

1

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

最好的问候, 直到

+0

对不起,迟了回复....但为什么是空的原因,当我做同样的事情c = db.getAllData();在onCreate()不是空的,并返回corect数据!!!! ....为什么线程内部不起作用? – adrian 2011-04-19 21:25:53

+1

@adrian也许值得尝试让db初始化db = new DBAdapter(this);因此你必须在线程的构造函数中传递上下文。这是你在onCreate中使用的上下文吗? – Till 2011-04-20 08:05:39

+0

我已经成功修复了我的程序...感谢你的帮助....非常感谢。现在我必须创建一个多线程服务器....另一个头痛!!!! – adrian 2011-04-20 14:50:11