Android 使用领域注册和登录

Android 使用领域注册和登录,android,login,registration,realm,Android,Login,Registration,Realm,我正在尝试使用领域数据库进行用户登录和注册。然而,我得到了如下错误: 尝试对空对象引用调用虚拟方法“void io.realm.realm.beginTransaction()” 有人能帮我吗 下面是我的注册和登录代码 注册代码: public class RegisterActivity extends AppCompatActivity { private static final String TAG = "Register"; EditText mEditTextFirstName,

我正在尝试使用领域数据库进行用户登录和注册。然而,我得到了如下错误:

尝试对空对象引用调用虚拟方法“void io.realm.realm.beginTransaction()”

有人能帮我吗

下面是我的注册和登录代码

注册代码:

public class RegisterActivity extends AppCompatActivity {

private static final String TAG = "Register";
EditText mEditTextFirstName, mEditTextLastName, mEditTextEmail,mEditTextPassword,mEditTextConfirmPassword;
Button mButtonSignUp;
Realm realm;
private MyRealmObject myRealmObject;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    try {
        realm = Realm.getInstance(getApplicationContext());
    } catch (Exception e) {
        e.printStackTrace();
    }

    mEditTextFirstName = (EditText) findViewById(R.id.edtfirstname);
    mEditTextLastName= (EditText) findViewById(R.id.edtlastname);
    mEditTextEmail = (EditText) findViewById(R.id.edtemail);
    mEditTextPassword = (EditText) findViewById(R.id.edtpassword);
    mEditTextConfirmPassword = (EditText) findViewById(R.id.edtconfirm);
    mButtonSignUp = (Button) findViewById(R.id.btnsignup);


    mButtonSignUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mEditTextFirstName.length() == 0) {
                showSnackBar("Enter FirstName");
                mEditTextFirstName.requestFocus();
            } else if (mEditTextLastName.length() == 0) {
                showSnackBar("Enter LastName");
                mEditTextEmail.requestFocus();
            } else if (mEditTextEmail.length() ==0) {
                showSnackBar("Enter a valid email");
                mEditTextEmail.requestFocus();
            }else if (mEditTextPassword.length() ==0) {
                showSnackBar("Enter a valid password");
                mEditTextPassword.requestFocus();
            }else if (mEditTextConfirmPassword.length() ==0) {
                        showSnackBar("Enter a valid Password");
                        mEditTextPassword.requestFocus();
            } else {

                try{

                    realm.beginTransaction();

                    myRealmObject = realm.createObject(MyRealmObject.class);
                    myRealmObject.setFirstName(mEditTextFirstName.getText().toString());
                    myRealmObject.setLastName(mEditTextLastName.getText().toString());
                    myRealmObject.setEmail(mEditTextEmail.getText().toString());
                    myRealmObject.setPassword(mEditTextPassword.getText().toString());
                    myRealmObject.setConfirmPassword(mEditTextConfirmPassword.getText().toString());


                    realm.commitTransaction();

                    showSnackBar("Save Success");


                } catch (RealmPrimaryKeyConstraintException e){
                    e.printStackTrace();
                    showSnackBar("User found on db.");
                }

            }
        }
    });


}

private void showSnackBar(String msg) {
    try {
        Snackbar.make(findViewById(R.id.relativeregister), msg, Snackbar.LENGTH_SHORT).show();
    } catch (NullPointerException e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    }
}



}
public class MyRealmObject extends RealmObject {
private String FirstName, LastName,ConfirmPassword;
@PrimaryKey
private String Email;
private String Password;

public MyRealmObject() {
}

public String getFirstName() {
    return FirstName;
}

public void setFirstName(String FirstName) {
    this.FirstName = FirstName;
}

public String getLastName() {
    return LastName;
}

public void setLastName(String LastName) {
    this.LastName = LastName;
}

public String getEmail() {
    return Email;
}

public void setEmail(String email) {
    this.Email = Email;
}

public String getPassword() {
    return Password;
}

public void setPassword(String password) {
    this.Password = password;
}

public String getConfirmPassword() {
    return getConfirmPassword();
}

public void setConfirmPassword(String confirmPassword) {
    this.ConfirmPassword = confirmPassword;
}
这是我的登录代码。

public class LoginActivity extends AppCompatActivity {

private static final String TAG = "Home";
private EditText mEditTextEmail, mEditTextPassword;
private TextView txtlogin;
TextView Create;
private Realm realm;
private MyRealmObject myRealmObject;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    try {
        realm = Realm.getInstance(getApplicationContext());
    } catch (Exception e) {
        e.printStackTrace();
    }

    mEditTextEmail = (EditText) findViewById(R.id.edtemail);
    mEditTextPassword = (EditText) findViewById(R.id.edtpswrd);
    txtlogin = (TextView) findViewById(R.id.txtlogin);
    Create = (TextView) findViewById(R.id.txtcreate);


    Create.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent i = new Intent(LoginActivity.this, RegisterActivity.class);
            startActivity(i);

        }
    });

    txtlogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mEditTextEmail.length() == 0) {
                showSnackBar("Enter EMAIL");
                mEditTextEmail.requestFocus();
            } else if (mEditTextPassword.length() == 0) {
                showSnackBar("Enter password");
                mEditTextPassword.requestFocus();
                Intent i = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(i);


            }
        }

         private boolean checkUser(String email,String password) {
                RealmResults<MyRealmObject> realmObjects = realm.where(MyRealmObject.class).findAll();
               for (MyRealmObject myRealmObject : realmObjects) {
                   if (email.equals(myRealmObject.getEmail()) && password.equals(myRealmObject.getPassword())) {
                        Log.e(TAG, myRealmObject.getEmail());
                        return true;
                    }
    }


                Log.e(TAG, String.valueOf(realm.where(MyRealmObject.class).contains("Email", email)));
               return false;
          }



        private void showSnackBar(String msg) {
            try {
                Snackbar.make(findViewById(R.id.relativelogin), msg, Snackbar.LENGTH_SHORT).show();
            } catch (NullPointerException e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
            }
        }


    });
}
}

有人指引我哪里错了


提前谢谢

请注意,不推荐使用
Realm.getInstance(context)
。您应该在应用程序类中设置默认RealmConfiguration,并使用
Realm.getDefaultInstance()
,如下所述:


尽管快速浏览代码不应该抛出异常,但在try/catch中包装
realm=realm.getInstance(getApplicationContext())
是危险的,因为如果该方法抛出异常,您将得到所看到的空指针。我会删除它。

嗨,Ishita,我看不出一个明确的原因,根据您的代码,为什么您的领域实例会为null。问题:1)您是否调试了realm=realm.getInstance(getApplicationContext())后面的代码以查看它是否为null?2) 您正在使用哪个版本的领域?0.88.2上的Realm.getInstance已被弃用,如果您不在0.88.2上,请尝试升级并尝试将其与RealmConfiguration一起使用,或在应用程序中设置默认配置。请参阅和“默认RealmConfiguration”一节。让我知道它是如何运行的。hello@Nerevar当我在realm=realm.getInstance(getApplicationContext()之后调试代码时,我遇到了null问题;我得到savedInstanceState=null realm=nullHey,好吧,知道您现在知道问题发生的位置了。我强烈建议您更改创建领域实例的方式。为了测试它是否有效,您可以尝试这样做:RealmConfiguration realmConfig=new RealmConfiguration.Builder(getActivity()).build();Realm Realm=Realm.getInstance(realmConfig);请注意,此代码应仅用于测试,如果这样做有效,您可以使实现更好、更清晰,请查看我在前面的评论中发送的链接。您是否查找了您正在使用的版本,以及它是否已被弃用?当我尝试将其更新为最新版本(0.88.2)时,您使用的是realm版本0.84.1'我的gradle出现了错误。所以我仍然使用0.84.1@nerevarf版本。他们更改了gradle文件中初始化领域的方式。请看这里:->安装。通过领域配置初始化领域对您有效吗?Hello@Christian Melchior..空对象引用的问题现在很好。我在我在登录时检查数据库中的用户名和密码。你能检查一下我写的代码是否正确吗?如果(email.equals(myRealmObject.getEmail())和&password.equals(myRealmObject.getPassword()))如果
myRealmObject!=null
,那么可以。