首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行Volley请求的后台调用getWritableDatabase()时,getWritableDatabase崩溃

在运行Volley请求的后台调用getWritableDatabase()时,getWritableDatabase崩溃
EN

Stack Overflow用户
提问于 2015-04-14 18:06:17
回答 1查看 161关注 0票数 0

当Caller片段运行时,请求能够成功地执行getWritableDatabase()。但是,当片段关闭或应用程序关闭时,在后台执行的volley请求无法执行getWritableDatabase()

代码语言:javascript
复制
public class ContactsTableManager {
private Context context;
private DBHelper ourHelper;
private SQLiteDatabase ourDatabase;
private static final String DATABASE_NAME = "Contacts";
private static final String DATABASE_TABLE = "ContactsTable";
private static final int DATABASE_VERSION = 1;
public static final String TAG = "contactsmanager.java";
public static final String KEY_NAME = "NAME";
public static final String KEY_NUMBER = "NUMBER";
public static final String KEY_ID = "ID";



public ContactsTableManager(Context c) {
    context = c;
}

public ContactsTableManager open() {


    ourHelper = new DBHelper(context);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close() {
    ourHelper.close();

}
public boolean addEntry(String Name, String Number) {

    boolean success=false;
    ContentValues cv = new ContentValues();
    cv.put(KEY_NAME,Name);
    cv.put(KEY_NUMBER,Number);
    if(!checkData(cv)){
        open();
        success = ourDatabase.insert(DATABASE_TABLE, null, cv) > 0;
        close();
    }

    return success;
}
private static class DBHelper extends SQLiteOpenHelper {

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                        KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        KEY_NAME + " TEXT NOT NULL, " + KEY_NUMBER + " TEXT NOT NULL); "
        );

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }
}

}

Volley,在一个片段上执行,我甚至尝试在onCreateView()中传递onCreateView()。没起作用。

代码语言:javascript
复制
    private void sendNumberRequest(final String name, final String phoneNumber) {


    String tag_string_req = "req_contact";



    StringRequest strReq = new StringRequest(Request.Method.POST,
            AppConfig.URL_Contacts, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            response=response.substring(response.indexOf("{"));


            try {
                JSONObject jObj = new JSONObject(response);
                Log.e(TAG, "JSONObject: " + jObj.toString());
                boolean error = jObj.getBoolean("error");

                // Check for error node in json
                if (!error) {

                    JSONObject user = jObj.getJSONObject("user");

                    ContactsTableManager contactsTableManager1=new ContactsTableManager(getActivity());





                    // Inserting row in users table

                    contactsTableManager1.addEntry(name,phoneNumber);

                    makeScreen();

                }
            } catch (JSONException e) {
                // JSON error
                Log.e(TAG, "Login Response: catch");
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Login Error: " + error.getMessage());


        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            // Posting parameters to login url
            Map<String, String> params = new HashMap<String, String>();
            params.put("tag", "contact_req");
            params.put("name", name);
            params.put("number", phoneNumber);

            return params;
        }

    };

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-14 18:24:26

当活动结束时,用于获取数据库的上下文就不再存在了。如果您想中止操作,那么可以使用onDestroy()取消可能的onDestroy()中的截取请求。

如果要将数据持久化到应用程序范围之外,请使用服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29634416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档