gpt4 book ai didi

c# - Realms.NativeTable.get_string 处的 Realm 查询错误(包装器管理到 native )

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:08 24 4
gpt4 key购买 nike

我正在尝试对我的第一个 Realm 数据库进行简单查询。我在尝试访问由我的查询方法返回的对象的属性时遇到错误。我有两个问题:
1.这个错误是什么意思?我很难理解它...
2. 我查询的方式正确吗?如果不是,我做错了什么?

错误日志:

[mono-rt] Stacktrace:

[mono-rt] at <unknown> <0xffffffff>

[mono-rt] at (wrapper managed-to-native) Realms.NativeTable.get_string >(Realms.TableHandle,intptr,intptr,intptr,intptr,bool&) <0x00057>

[mono-rt] at Realms.RealmObject.GetStringValue (string) <IL 0x0009d, >0x00323>

[mono-rt] at EasyVending.RCreditCard.get_holderName () <IL 0x0000e, 0x0006f>

[mono-rt] at EasyVending.RealmManager.getCreditCard () [0x0001c] in /Users/Bernardo/Projects/EasyVending/EasyVending/DataBase/RealmManager.cs:75

[mono-rt] at EasyVending.Android.CreditCartManagement.OnCreate (Android.OS.Bundle) [0x00111] in /Users/Bernardo/Projects/EasyVending/EasyVending.Android/Activities/CreditCartManagement.cs:89

[mono-rt] at Android.Support.V4.App.FragmentActivity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) <IL 0x00013, 0x000ff>

[mono-rt] at (wrapper dynamic-method) object.13add723-97a5-4397-9c8a-e6fc23d98c3c (intptr,intptr,intptr) <IL 0x00017, 0x00043>

[mono-rt] at (wrapper native-to-managed) object.13add723-97a5-4397-9c8a-e6fc23d98c3c (intptr,intptr,intptr) <IL 0x0001f, 0x00097>

[mono-rt] Attempting native Android stacktrace:

[mono-rt] at ???+1 [0xbe903ac0]

[mono-rt] at ???+1 [0x98f50ffc]

=================================================================

Got a SIGSEGV while executing native code. This usually indicates
[mono-rt] a fatal error in the mono runtime or one of the native libraries
[mono-rt] used by your application.
[mono-rt]

[libc] Fatal signal 11 (SIGSEGV), code 1, fault addr 0x97b77168 in tid 9849 (vending_android)

=====================================

public class RCreditCard : RealmObject {
public string holderName { get; set; }
public string bandeira { get; set; }
public string digitos { get; set; }
public string token { get; set; }
}

public class RealmManager {
private string databaseName {
get {
return "PayBluDatabase.db";
}
}
private string androidPath {
get {
return Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), databaseName);
}
}

public Realm getRealm() {
return Realm.GetInstance(androidPath);
}

public void closeRealm(Realm realm) {
realm.Close();
}

public Transaction insertCreditCard(EasyVending.CreditCard creditCard) {
var realm = getRealm();
using(var transaction = realm.BeginWrite()) {
var insertedCreditCard = realm.CreateObject<RCreditCard>();

insertedCreditCard.holderName = creditCard.HolderName;
insertedCreditCard.bandeira = creditCard.CreditCardBrand;
insertedCreditCard.digitos = creditCard.MaskedCreditCardNumber;
insertedCreditCard.token = creditCard.InstantBuyKey;

transaction.Commit();
closeRealm(realm);
return transaction;
}
}

public Transaction removeCreditCard() {
var realm = getRealm();
using(var transaction = realm.BeginWrite()) {
realm.RemoveAll<RCreditCard>();
transaction.Commit();
closeRealm(realm);
return transaction;
}
}

public CreditCard getCreditCard() {
var realm = getRealm();
var rCreditCard = realm.All<RCreditCard>().First();
closeRealm(realm);
var creditCard = new CreditCard() {
CreditCardBrand = rCreditCard.bandeira,
MaskedCreditCardNumber = rCreditCard.digitos,
HolderName = rCreditCard.holderName
};
return creditCard;
}

public bool hasCreditCard() {
bool answer = false;
var realm = getRealm();
if(realm.All<RCreditCard>().Count() > 0) {
answer = true;
}
closeRealm(realm);
return answer;
}
}

当我尝试访问我的查询返回的 RCreditCard 对象的任何属性时发生错误:

CreditCardBrand = rCreditCard.bandeira,

来自

var rCreditCard = realm.All<RCreditCard>().First();

如果问题不够清楚,请告诉我。

最佳答案

问题是您在尝试在 getCreditCard() 中读取 rCreditCard 的属性之前关闭了 Realm 。 Realm对象中的属性是零拷贝的,它们直接访问数据库,所以一旦你关闭了realm,对象就失效了。我们应该更好地处理这种情况,目前还不清楚。感谢您向我们指出!

通常,您可能不希望经常打开和关闭 Realm ,除非这些调用发生在不同的线程上。如果您坚持这样做,您应该将 Realm.Close() 调用移到事务 using 范围之外。就像现在一样,如果在事务期间抛出某些东西,它将被回滚,但您的 Realm 不会像您预期的那样关闭。

最后,通常没有必要拥有一个反射(reflect)您的 RealmObject 类的“普通”类。当然,在您的情况下可能有一些原因,但在这里并不明显。通常,您会直接使用 RealmObject 类。

关于c# - Realms.NativeTable.get_string 处的 Realm 查询错误(包装器管理到 native ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38468403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com