【发布时间】:2016-10-24 18:50:02
【问题描述】:
最近我开始了一个安卓应用项目。我需要尽可能结构化地管理数据。
所以我选择了领域并对其进行了一些修改。
但我遇到了一些错误。但是我不知道为什么会发生这个错误。
错误是
不允许嵌套事务。在每个 beginTransaction() 之后使用 commitTransaction()。
我的代码在下面。
public class CuratorApplication extends Application {
private Realm realm;
@Override
public void onCreate() {
super.onCreate();
Log.e("debug", "Application class create!!");
configureRealmDatabase(this);
}
private void configureRealmDatabase(Context context){
RealmConfiguration config = new RealmConfiguration.Builder(context)
.name("curator.realm")
.build();
Realm.setDefaultConfiguration(config);
}
}
如here 中所述,我在Application 类中注册领域
我尝试在活动中进行交易。但它显示错误。 :(
package com.nolgong.curator.screen;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.nolgong.curator.R;
import com.nolgong.curator.model.retrofit.Game;
import com.nolgong.curator.model.retrofit.GameInformation;
import com.nolgong.curator.model.retrofit.Team;
import com.nolgong.curator.network.NetworkClient;
import java.io.IOException;
import java.util.Properties;
import io.realm.Realm;
import io.realm.exceptions.RealmPrimaryKeyConstraintException;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class IntroActivity extends AppCompatActivity {
private Button confirmBtn;
private EditText confirmText;
private Realm realm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intro);
setUp();
registerListener();
}
private String getProperty() throws IOException{
Properties properties = new Properties();
properties.load(getResources().openRawResource(R.raw.config));
String property = properties.getProperty("serverAddress");
Log.e("debug", "Property : " + property);
return property;
}
private void setNetworkClient(String serverAddress){
Log.e("debug", "Address : " + serverAddress);
NetworkClient.getInstance(serverAddress);
}
private void setUp(){
try {
setNetworkClient(getProperty());
} catch (IOException e){
Log.e("debug", "set network" + e);
}
confirmBtn = (Button)findViewById(R.id.intro_confirm);
confirmText = (EditText)findViewById(R.id.intro_input);
realm = Realm.getDefaultInstance();
Log.e("debug", "transaction state : " + realm.isInTransaction());
Log.e("debug", "CONFIGURATION : \n" + realm.getConfiguration());
}
private void registerListener(){
confirmBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String teamId = confirmText.getText().toString();
Integer digit = Integer.valueOf(teamId);
Log.e("debug", digit + "");
NetworkClient.getInstance().login(digit, new Callback<GameInformation>() {
@Override
public void onResponse(Call<GameInformation> call, Response<GameInformation> response) {
int responseCode = response.code();
switch (responseCode){
case 200:
GameInformation gameInformation = response.body();
Log.e("debug", "game information " + gameInformation.toString());
Game game = gameInformation.getGame();
Team team = gameInformation.getTeam();
updateGameToRealm(game);
updateTeamToRealm(team);
break;
default:
Log.e("debug", "Maybe something happened.");
break;
}
}
@Override
public void onFailure(Call<GameInformation> call, Throwable t) {
Log.e("debug", "Login fail :" + t.toString());
}
});
}
});
}
private void updateGameToRealm(Game game){
com.nolgong.curator.model.database.Game rGame = new com.nolgong.
curator.model.database.Game(game.getId(), game.getDate(),
game.getSession(), game.getRunningTime());
realm.beginTransaction();
try {
realm.copyToRealm(rGame);
} catch (RealmPrimaryKeyConstraintException e){
Log.e("debug", e.toString());
realm.cancelTransaction();
} finally {
realm.commitTransaction();
}
}
private void updateTeamToRealm(Team team){
com.nolgong.curator.model.database.Team rTeam = new com.nolgong.
curator.model.database.Team(team.getId(), team.getMembers(),
team.getGameId(), team.isClientDataSynced(),
team.getJob(), team.getDigit(),
team.getPoint());
realm.beginTransaction();
try {
realm.copyToRealm(rTeam);
} catch (RealmPrimaryKeyConstraintException e){
Log.e("debug", e.toString());
realm.cancelTransaction();
} finally {
realm.commitTransaction();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
realm.close();
}
}
为什么领域显示错误?我正确使用了吗?或者这只是一个错误? 请帮帮我ioi..
【问题讨论】:
-
你能显示与错误相关的代码吗?
-
您在代码中某处连续调用
beginTransaction()两次,但此处未引用。 -
如果某处有循环,请在循环外开始事务,然后在循环结束后提交;还使用常规 for() 循环而不是 foreach
-
@Eenvincible 从技术上讲
foreach现在可以在 RealmResults 上正常工作,因为 0.89.0 启用了“正确的迭代行为”,但是是的。 -
糟糕!我忘了更改代码。现在我更改了源代码。