为了账号安全,请及时绑定邮箱和手机立即绑定

SQLiteOpenHelper - 无法访问已处置的对象

SQLiteOpenHelper - 无法访问已处置的对象

C#
梵蒂冈之花 2022-12-24 12:54:06
我有一个我的SQLiteOpenHelper班级,它被写成单身人士。我应该注意,我不是在 Java 中执行此操作,而是使用 Xamarin.Android C# 编写此程序。这是该课程的一个片段:public class DatabaseHelper : SQLiteOpenHelper{    private static readonly string TAG = typeof(DatabaseHelper).FullName;    private static readonly string _databaseName = "istockdb";    private static readonly int _databaseVersion = 32;    private static DatabaseHelper _instance;    private Context _context;    private DatabaseHelper(Context context) : base(context, _databaseName, null, _databaseVersion)    {        _context = context;    }    [MethodImpl(MethodImplOptions.Synchronized)]    public static DatabaseHelper Instance(Context context)    {        // *** Use the application context, which will ensure that ***        // *** the Activity's context is not accidentally leaked ***        return _instance ?? (_instance = new DatabaseHelper(context.ApplicationContext));    }}所以我有DatabaseHelper一个单身人士,在活动和服务中这样使用:服务:[Service(Name=Text.MobileBackgroundHbService, Enabled = true, Exported = true), IntentFilter(new []{Intents.SyncHeartbeats})]public class BGHeartbeatService : BaseIntentService{    public BGHeartbeatService()    {        this._database = DatabaseHelper.Instance(Application.Context);    }    protected override void OnHandleIntent(Intent intent)    {        if (this._database == null)            this._database = DatabaseHelper.Instance(Application.Context);        if (intent.Action.Equals(Intents.SyncHeartbeats)) SyncHeartbeatRecords();        var broadcastIntent = new Intent(Intents.MobileRefresh);        SendBroadcast(broadcastIntent);    }}
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

事实证明,我的单例实例DatbaseHelper没有被处理掉。


实际上发生的事情是我正在处理由辅助方法中SQLiteDatabase的 from 使用的对象。DatbaseHelper


要真正解决这个问题,我所要做的就是改变:


/// <summary>

/// Inserts a Heartbeat record into local DB.

/// </summary>

/// <param name="heartbeat"></param>

/// <returns></returns>

public long InsertHeartbeat(Heartbeat heartbeat)

{

    if (heartbeat == null) return -2L;

    // This using() statement is causing the disposal

    using (var db = this.WritableDatabase)

    {

        var id = -3L;

        db.BeginTransactionNonExclusive();

        try

        {

            var cv = GetContentValues(heartbeat);

            id = db.Insert(DatabaseSchema.Heartbeat.TableName, null, cv);

            db.SetTransactionSuccessful();

        }

        catch (Exception e)

        {

            // TODO: Document Exception

            Util.Tools.Bark(e);

        }

        finally

        {

            db.EndTransaction();

        }

        return id;

    }

}

到:


/// <summary>

/// Inserts a Heartbeat record into local DB.

/// </summary>

/// <param name="heartbeat"></param>

/// <returns></returns>

public long InsertHeartbeat(Heartbeat heartbeat)

{

    if (heartbeat == null) return -2L;


    // This is no longer initialized in a using() statement

    var db = this.WritableDatabase;


        var id = -3L;

        db.BeginTransactionNonExclusive();

        try

        {

            var cv = GetContentValues(heartbeat);

            id = db.Insert(DatabaseSchema.Heartbeat.TableName, null, cv);

            db.SetTransactionSuccessful();

        }

        catch (Exception e)

        {

            // TODO: Document Exception

            Util.Tools.Bark(e);

        }

        finally

        {

            db.EndTransaction();

        }

        return id;


}

概括:


通过在辅助方法内的语句内初始化我的SQLiteDatabase db对象,我处理了我需要的对象。using()SQLiteDatabaseDatabaseHelper


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号