Android 使用领域注册和登录
我正在尝试使用领域数据库进行用户登录和注册。然而,我得到了如下错误: 尝试对空对象引用调用虚拟方法“void io.realm.realm.beginTransaction()” 有人能帮我吗 下面是我的注册和登录代码 注册代码: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,
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
,那么可以。