【问题标题】:aSQlite error from asynctask来自异步任务的 SQlite 错误
【发布时间】:2015-12-17 12:42:18
【问题描述】:

我正在尝试构建事件列表器。我正在从一些站点获取事件,然后记录到数据库然后显示。

这是我从 main 激活按钮时调用的 updatedb 类:

public class UpdateDB {
    private String TAG = "Chic";
    EventRetriever eventRetriever;
    private Activity mActivity;

     public UpdateDB(Activity activity){
        Log.e(TAG,"UpdateDB constructor");
        this.mActivity = activity;

        eventRetriever = new EventRetriever(mActivity);
        eventRetriever.execute();
        Log.e(TAG,"UpdateDB constructor async executed");
        currentDate = Calendar.getInstance(); //Get the current date
        lastUpdateTime=currentDate;//if succesful methodu olması lazım
        Log.e(TAG,"DB updated");
    }

这是更新数据库的内部:

class EventRetriever extends AsyncTask<Void,Void,List<Event>> {

 Event evnt;
    private List<Event> evnts;
    DBHandler dbhandler ;

  public EventRetriever(Activity activity){
        super();
        Log.e(TAG,"EventRetriever constructor");
        mActivity = activity;
    }

   protected void onPreExecute() {
        super.onPreExecute();
        Log.e(TAG,"onPreExecute()");
        dialog = ProgressDialog.show(mActivity,"LUTFEN BEKLEYINIZ...","ETKINLIKLER VERITABANINA KAYIT ICIN HAZIRLANIYOR...", true);
    }

 protected List<Event>  doInBackground(Void ... params) {

        Log.e(TAG,"doinbackground");

//taking each event and then putting into events arraylist

  evnts.add(evnt);

  Log.e(TAG,"doinbackground sonu");
        return evnts;
    }//end of doinbackground

 @Override
    protected void onPostExecute(List<Event> events) {
        super.onPostExecute(events);
        Log.e(TAG,"onPostExecute()");
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        Log.e(TAG,"ITU db ekleme");

        dbhandler = new DBHandler(mContext);

        for(Event e:events) {
            dbhandler.addEvent(e);
        }


    Log.e(TAG,"endof onPostExecute()");
    }//endof onpostexecute
}//end of asyntask

这是事件类的构造函数和getter setter

 public Event(String nme,String loc,String  typ,String  lnk,String sDate,String eDate,String desc) {
    this.description = desc;
    this.link = lnk;
    this.type = typ;
    this.location = loc;
    this.startDate = sDate;
    this.endDate = eDate;
    this.name = nme;
}

这是我的数据库助手类。我在这里进行所有操作

 public class DBHandler  extends SQLiteOpenHelper {

    private String TAG = "Chic";

    SQLiteDatabase db;

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 2;

    // Database Name
    private static final String DATABASE_NAME = "eventsManager";

    // events table name
    private static final String TABLE_EVENTS = "events";

    // EVents Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_LOCATION = "location";
    private static final String KEY_TYPE = "type";
    private static final String KEY_START_TIME = "start_time";
    private static final String KEY_END_TIME = "end time";
    private static final String KEY_DESCRIPTION = "description";
    private static final String KEY_LINK = "link";


    public DBHandler(Context context) {//, Activity mActivity
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        Log.e(TAG,"db handler construct");

  }

public void onCreate(SQLiteDatabase db) {
        Log.e(TAG,"db handleroncreta");
        String CREATE_EVENTS_TABLE = "CREATE TABLE If not exists " + TABLE_EVENTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY autoincrement," + KEY_NAME + " TEXT not null,"
               + KEY_LOCATION + " TEXT not null," + KEY_TYPE + " TEXT not null,"
                + KEY_LINK + " TEXT not null,"
                + KEY_START_TIME + " TEXT not null,"
                + KEY_END_TIME + " TEXT not null,"//bu belki null olabilir
         + KEY_DESCRIPTION + " TEXT not null"//bu da null olabilir
        + ")";

        db.execSQL(CREATE_EVENTS_TABLE);
    }

public void addEvent(Event e) {
        Log.e(TAG,"db handler addevent");
        SQLiteDatabase db = this.getWritableDatabase();

        //db.execSQL("DROP TABLE IF EXISTS "+TABLE_EVENTS);
        ContentValues values = new ContentValues();
       alues.put(KEY_NAME, e.getName()); // event Name
        values.put(KEY_LOCATION, e.getLocation());
        values.put(KEY_TYPE, e.getType());
        values.put(KEY_LINK, e.getLink());
        values.put(KEY_START_TIME, e.getStartDate()); // Event start
        values.put(KEY_END_TIME, e.getEndDate());
        values.put(KEY_DESCRIPTION, e.getDescription());

        // Inserting Rows
        db.insert(TABLE_EVENTS, null, values);
        db.close(); // Closing database connection
    }

public void open() throws SQLException {
        Log.e(TAG,"db handler open");
        db = this.getWritableDatabase();
    }

}//endof class

我没有使用光标。我使用价值观。

我也有这个方法在事件中:

public void addEvents(List<Event> events) {
        Log.e(TAG,"db handler addevents: "+events.get(0).getDescription());
      open();

        //db.execSQL("DROP TABLE IF EXISTS "+TABLE_EVENTS);
        for(Event e:events) {
            Log.e(TAG,"ekleniyor: "+e.getName());
            ContentValues values = new ContentValues();
            values.put(KEY_NAME, e.getName()); // event Name
            values.put(KEY_LOCATION, e.getLocation());
            values.put(KEY_TYPE, e.getType());
            values.put(KEY_LINK, e.getLink());
            values.put(KEY_START_TIME, e.getStartDate()); // Event start
            values.put(KEY_END_TIME, e.getEndDate());
            values.put(KEY_DESCRIPTION, e.getDescription());

            // Inserting Rows
            db.insert(TABLE_EVENTS, null, values);
        }//for sonu
        db.close(); // Closing database connection
        Log.e(TAG,"db handler addevents sonu");
    }*/

我使用它来将事件作为数组发送。现在我一一发送,但错误仍然相同。还有一个问题,哪个好?

我也尝试在 doitbackground 中再次发送错误。

对于我发布的那些代码,错误是:

    AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: cu PID: 28765
                                                                         java.lang.NullPointerException

Kat android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
                                                                             at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
                                                                             at  . .DBHandler.addEvent(DBHandler.java:99)
                                                                             at  . .EventRetriever.onPostExecute(UpdateDB.java:401)
                                                                             at  . .EventRetriever.onPostExecute(UpdateDB.java:73)
                                                                             at android.os.AsyncTask.finish(AsyncTask.java:632)
                                                                             at android.os.AsyncTask.access$600(AsyncTask.java:177)
                                                                             at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                             at android.os.Looper.loop(Looper.java:136)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5584)
                                                                             at java.lang.reflect.Method.invokeNative(Native Method)
                                                                             at java.lang.reflect.Method.invoke(Method.java:515)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
                                                                             at dalvik.system.NativeStart.main(Native Method)

从主要,当我这样做时

Event evt =new Event("name","name","name","name","name","name","name");
        Event evtt =new Event("name","name","name","name","name","name","name");
        List<Event> e = new ArrayList();
        e.add(evt);  e.add(evtt);
      DBHandler d = new DBHandler(this);
        d.addEvents(e);

它没有错误地写入数据库。所以它也不能为空。我正在检查值。

【问题讨论】:

    标签: android sqlite android-asynctask


    【解决方案1】:
    dbhandler = new DBHandler(mContext);
    

    您的mContext 在此处为空或无效。该代码没有显示您声明或初始化该变量。

    【讨论】:

      【解决方案2】:

      你写错了dbhandler = new DBHandler(mContext); 行。

      应该是dbhandler = new DBHandler(mActivity);

      希望这会对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多