MVP - java.lang.NullPointerException:访问数据库

时间:2015-07-17 01:18:57

标签: android android-sqlite

我开始学习Android,我正在尝试开发一款应用。我遇到了一些困难,比如在数据库中保存数据。

我使用MVP模式(模型视图演示者)构建了应用程序。在视图中,我有一些字段(例如代码和文本),我想保存在数据库中。

查看

public class PostView extends Fragment {

    DatabaseHelper dbHelper;
    PostPresenterImpl postPresenterImpl = new PostPresenterImpl(getActivity());

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

    View view = inflater.inflate(R.layout.fragment_post, null);

    id_server = (EditText) view.findViewById(R.id.editText1);
    content = (EditText) view.findViewById(R.id.editText2);
    id_search = (EditText) view.findViewById(R.id.editText3);
    ...

    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tv.setText("");
            PostModel postModel = new PostModel();
            postModel.setIdServer(Integer.parseInt(id_server.getText().toString()));
            postModel.setContent(content.getText().toString());
            System.out.println("setOnClickListener");
            //postPresenterImpl.setContext(getActivity().getApplicationContext());
            postPresenterImpl.addPost(postModel);
            //list = postPresenterImpl.getAllStudentsList();
            //tv.setText(postPresenterImpl.print(list));
        }
    });

演示

public class PostPresenterImpl implements PostPresenter {


   private Context context;

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

   @Override
   public boolean addPost(PostModel postModel) {
       Post post = new Post(context);
       System.out.println("postModel " + postModel.getIdServer());
       System.out.println("postModel " + postModel.getContent());
       System.out.println("postModel " + postModel.getTimeStamp());
       System.out.println("PostPresenterImpl - addPost");
       post.addPostDetail(postModel);
       return true;
   }

模型

public class Post extends SQLiteOpenHelper implements Common {

    public static String TAG = "tag_post";

    private Context context;

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

    public Post(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // assigning context Change your constructor
        this.context = context;
    }

    public long addPostDetail(PostModel postModel) {
         System.out.println("addPostDetail");

         SQLiteDatabase db = getWritableDatabase();
         // Creating content values
         ContentValues values = new ContentValues();
         values.put(KEY_IDSERVER, postModel.getIdServer());
         values.put(CONTENT, postModel.getContent());
         // insert row in post table
         long insert = db.insert(TABLE_POST, null, values);
         return insert;
     }

执行应用程序并在屏幕上填充filds后,将启动一个激活:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)

在PostPresenterImpl类上我打印了objetct的值,这没关系。 Anny sugest,plis?

2 个答案:

答案 0 :(得分:2)

PostPresenterImpl postPresenterImpl = new PostPresenterImpl(getActivity());

将此初始化移至片段生命周期中的onAttach()或更高版本。在实例初始化阶段,片段尚未附加到活动,getActivity()返回null

您看到的例外情况是由null传递给ContextSQLiteOpenHelper构造函数的。{/ 1}。

答案 1 :(得分:1)

您是否有一个单独的合同类,可以创建数据库或类似的东西?因为您正在尝试访问数据库而在您的代码中,我无法看到创建命令。

CCombo

Here你有一篇很好的文章谈到在Android上正确管理数据库。

相关问题