chennaione / sugar

Insanely easy way to work with Android Database.
http://satyan.github.com/sugar/
MIT License
2.62k stars 583 forks source link

Using Sugar in a class with no context (such as an Xposed module) #317

Open waylaidwanderer opened 9 years ago

waylaidwanderer commented 9 years ago

I'm trying to use Sugar in my Xposed module to save some stats, but since Xposed modules provide no context, it's causing the following exception:

E/Xposed﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'com.orm.Database com.orm.SugarApp.getDatabase()' on a null object reference
            at com.orm.SugarRecord.find(SugarRecord.java:204)
            at com.orm.SugarRecord.find(SugarRecord.java:172)
            at net.jzhang.powernap.Database.DatabaseHelper.SaveStat(DatabaseHelper.java:25)
            at net.jzhang.powernap.xposed.WakeLockManager.handleWakeLockAcquire(WakeLockManager.java:353)
            at net.jzhang.powernap.xposed.WakeLockManager.access$100(WakeLockManager.java:39)
            at net.jzhang.powernap.xposed.WakeLockManager$8.beforeHookedMethod(WakeLockManager.java:284)
            at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:636)
            at com.android.server.power.PowerManagerService.acquireWakeLockInternal(Unknown Source)
            at com.android.server.power.PowerManagerService.access$3500(PowerManagerService.java:96)
            at com.android.server.power.PowerManagerService$BinderService.acquireWakeLock(PowerManagerService.java:3057)
            at android.os.IPowerManager$Stub.onTransact(IPowerManager.java:66)
            at android.os.Binder.execTransact(Binder.java:446)

This is the method I'm using:

public void SaveStat(String packageName, String statName, String type, boolean isBlocked) {
    List<AppPackage> appPackages = AppPackage.find(AppPackage.class, "name = ?", packageName);
    if (appPackages.size() > 0) {
        XposedBridge.log(TAG + "Package found in database.");
        AppPackage appPackage = appPackages.get(0);
        List<Stat> stats = Stat.find(Stat.class, "name = ? and type = ?", statName, type);
        if (stats.size() > 0 && isBlocked) {
            Stat stat = stats.get(0);
            stat.timesBlocked += 1;
            stat.save();
            XposedBridge.log(TAG + "Existing stat updated in database.");
        } else {
            // create stat and save
            new Stat(statName, type, appPackage).save();
            XposedBridge.log(TAG + "New stat saved to database.");
        }
    } else {
        // create package in database
        AppPackage appPackage = new AppPackage(packageName);
        appPackage.save();
        // create stat for app
        new Stat(statName, type, appPackage).save();
        XposedBridge.log(TAG + "New package and stat created in database.");
    }
}

Line 25 as mentioned in the error is the first line of the SaveStat function.

I can still retrieve a context object in Xposed, but since 1.1 you can't provide a context to the library anymore. Is there another way to do accomplish what I want?

pouyadanesh commented 7 years ago

I have the same problem have you found something to resolve this issue?