Android Studio中Dialog向SQLite数据库添加数据的初始化问题
问题解决:AppCompatDialogFragment中初始化SQLite数据库实例报错
报错原因
在Fragment的成员变量位置直接调用getActivity()初始化MyDbCode时,Fragment还未与Activity完成绑定,此时getActivity()返回null,传入数据库构造方法会触发空指针异常。
解决方案
方案1:在onCreateDialog方法内初始化数据库
onCreateDialog执行时,Fragment已依附到Activity,getActivity()能返回有效上下文:
public class MyDialogue extends AppCompatDialogFragment { private EditText edtkeytitle; private MyDbCode db; // 仅声明变量,不提前初始化 @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { // 此时getActivity()已可用,初始化数据库实例 db = new MyDbCode(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.dialogue_layout, null); builder.setView(view) .setTitle("Create Title") .setNegativeButton("cancel", (dialog, which) -> {}) .setPositiveButton("ok", (dialog, which) -> { String key_title = edtkeytitle.getText().toString(); // 可选:添加非空判断避免无效插入 if (!key_title.trim().isEmpty()) { db.insertDataStore(key_title, ""); } }); edtkeytitle = view.findViewById(R.id.edtkeytitle); return builder.create(); } }
方案2:在onAttach方法中获取上下文后初始化
onAttach是Fragment绑定Activity的生命周期方法,能直接拿到有效上下文:
public class MyDialogue extends AppCompatDialogFragment { private EditText edtkeytitle; private MyDbCode db; @Override public void onAttach(@NonNull Context context) { super.onAttach(context); // 用绑定的上下文初始化数据库 db = new MyDbCode(context); } @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { // 后续弹窗逻辑不变,直接在确定按钮点击事件中使用db AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.dialogue_layout, null); builder.setView(view) .setTitle("Create Title") .setNegativeButton("cancel", (dialog, which) -> {}) .setPositiveButton("ok", (dialog, which) -> { String key_title = edtkeytitle.getText().toString(); if (!key_title.trim().isEmpty()) { db.insertDataStore(key_title, ""); } }); edtkeytitle = view.findViewById(R.id.edtkeytitle); return builder.create(); } }
额外优化建议
- 避免频繁关闭数据库连接:你的
MyDbCode中每次操作后调用db.close()会降低性能,SQLiteOpenHelper会自动管理连接,建议移除所有db.close()调用。 - 数据库实例单例化:给
MyDbCode实现单例模式,避免重复创建数据库实例,同时使用Application上下文防止内存泄漏:
public class MyDbCode extends SQLiteOpenHelper { private static MyDbCode instance; private static final String Database_Name = "Alone.db"; private static final int Database_ID = 1; private static final String TABLE_NAME = "alonetable"; private static final String TABLE_Data_NAME = "alonedata"; private static final String userpass = "Pass"; private static final String key_title = "key_title"; private static final String key_data = "key_data"; public static synchronized MyDbCode getInstance(Context context) { if (instance == null) { // 使用Application上下文 instance = new MyDbCode(context.getApplicationContext()); } return instance; } private MyDbCode(Context context) { super(context, Database_Name, null, Database_ID); } // 其他重写方法和业务方法不变,移除所有db.close() }
使用时只需调用db = MyDbCode.getInstance(getActivity());即可。
内容的提问来源于stack exchange,提问作者Abhishek Gupta...
相关产品推荐
相关产品推荐

