开发者

force close at cursor line!

Hy! I'm trying to create an application that looks for gps data that was stored in SQlite database. But I'm facing a problem: I built an DbAdapter class that creates my database and now I'm trying from another class to get an cursor over my all data,using this function:

public Cursor fetchAllData() {

        return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_LONGITUDE,KEY_LATITUDE,KEY_COUNTRY,KEY_TOWN,KEY_STREET}, null, null, null, null, null);
    }

Now,I'm creating an instance of DbAdapter in my new class,but I get forceclose when I insert this line:Cursor c=db.fetchAllData();

The class that creates my database looks like this:

package test.android;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class CoordonateDbAdapter {


    public static final String KEY_ROWID = "_id";
    public static final String KEY_LONGITUDE= "longitude";
    public static final String KEY_LATITUDE = "latitude";
    public static final String KEY_COUNTRY= "country";
    public static final String KEY_TOWN= "town";
    public static final String KEY_STREET = "street";

    private static final String TAG = "CoordonateDbAdapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private static final String DATABASE_CREATE =
            "create table car1 (_id integer primary key autoincrement, "
                    + "longitude text not null, latitude text not null," +
                   "country text not null,town text not null,street text not null);";

    private static final String DATABASE_NAME = "gps";
    private static final String DATABASE_TABLE = "masini";
    private static final int DATABASE_VERSION = 1;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS notes");
            onCreate(db);
        }
    }
    public CoordonateDbAdapter(Context ctx) {
        this.mCtx = ctx;
    }
    public CoordonateDbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }
    public long insertData(String longitude, String latitude, String country, String town, String street) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_LONGITUDE, longitude);
        initialValues.put(KEY_LATITUDE, latitude);
        initialValues.put(KEY_COUNTRY, country);
        initialValues.put(KEY_TOWN, town);
        initialValues.put(KEY_STREET, street);

        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }
    public boolean deleteData(long rowId) {

        return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }
   public Cursor fetchAllData() {

        return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_LONGITUDE,KEY_LATITUDE,KEY_COUNTRY,KEY_TOWN,KEY_STREET}, null, null, null, null, null);
    }
    public Cursor fetchData(long rowId) throws SQLException {

        Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] 
                    {KEY_ROWID, KEY_LONGITUDE,KEY_LATITUDE,KEY_COUNTRY,KEY_TOWN,KEY_STREET}, 
                     KEY_ROWID + "=" + rowId, null, null, null, null, null开发者_Python百科);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
    public boolean updateNote(long rowId, String longitude, String latitude,String country, String town,String street) {
        ContentValues args = new ContentValues();
        args.put(KEY_LONGITUDE, longitude);
        args.put(KEY_LATITUDE, latitude);
        args.put(KEY_COUNTRY, country);
        args.put(KEY_TOWN, town);
        args.put(KEY_STREET, street);

        return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    }

    public List<String> selectAll() {

       List<String> list = new ArrayList<String>();
       Cursor cursor = this.mDb.query(DATABASE_TABLE, new String[] { "longitude"},

         null, null, null, null, "name desc");

       if (cursor.moveToFirst()) {

          do {

             list.add(cursor.getString(0));

          } while (cursor.moveToNext());

       }
       if (cursor != null && !cursor.isClosed()) {

          cursor.close();

       }

       return list;

    }
}

And the class that retrieves the gps data is like this:

package test.android;

import java.util.List;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Toast;
public class screen_database extends Activity{

      public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.screen_database);
           CoordonateDbAdapter db = new CoordonateDbAdapter(this); 
          db.open();
          long id;
      //    id= db.insertData("-36.2", "125","Romania","Cluj","Zorilor");
      //    db.insertData("44", "55","Romania","Iasi","Alexandru Ioan Cuza");
       //   List<String> names = db.selectAll();
           Cursor c=db.fetchAllData();

         /*  if (c.moveToFirst())
            {
                do {          
                  //  DisplayTitle(c);
                } while (c.moveToNext());
            }*/
         //   c.close();

        }

      /*  public void DisplayTitle(Cursor c)
        {
            Toast.makeText(this, 
                    "longitude: " + c.getString(0) + "\n" +
                    "latitude: " + c.getString(1) + "\n" +
                    "country: " + c.getString(2) + "\n" +
                    "town:  " + c.getString(3),
                    Toast.LENGTH_LONG).show();        
        }*/ 
}
//}

You can see lots of lines that are comments because I get force close when I'm asking for a Cursor,so I tried to keep it as simple. Do I need any permissions to work with cursors,becuase I looked on the internet and all the line code looks like mine?! Another problem is that my application is quite big,and I'm accesing this classes from other classes....a long row of classes until I get to query from the Sqlite. I would really apreciate if you would help me,it might be something simple but I can't figure it out what it is.Thank you!!!


first try to access directly by copying

    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_LONGITUDE,KEY_LATITUDE,KEY_COUNTRY,KEY_TOWN,KEY_STREET}, null, null, null, null, null);

instead of calling it by method. If that works, check if curser is available in the method. If it is, try to reduce the SQLQuery like

    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_LONGITUDE}, null, null, null, null, null);

and add more columns step by step.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜