将 Parse 服务器添加到现有项目

Add Parse server to an already existing project

我有一个项目,我想向其中添加 Parse。我在我的电脑上安装了 Parse 服务器,从他们的网站下载了 SDK,它运行得非常好。
但是,我不想使用他们网站上的 SDK,我只想将库添加到我的项目中。

这是我所做的:我将这些库文件复制到我的项目 libs 文件夹中

'libs/parse-android-1.13.1.jar'
'libs/bolts-android-1.2.0.jar'

这是我的代码:

在 build.gradle 文件中:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'

    compile files('libs/parse-android-1.13.1.jar')
    compile files('libs/bolts-android-1.2.0.jar')

}

我添加了上面的依赖。

主要Activity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Parse.initialize(new Parse.Configuration.Builder(getApplicationContext())
                .applicationId("kooora.com100plus")
                .clientKey("kooora.com100plusMasterKey")
                .server("http://10.0.2.2:1337/parse/")
                .build()
        );


        ParseObject gameScore = new ParseObject("GameScore");
        gameScore.put("score", 1337);
        gameScore.put("playerName", "Sean Plott");
        gameScore.put("cheatMode", false);
        gameScore.saveInBackground(new SaveCallback() {
            public void done(ParseException e) {
                if (e == null) {
                    Log.i("Parse", "Save Succeeded");
                } else {
                    Log.i("Parse", e.getMessage());
                }
            }
        });
    }
}

这是我收到的错误的日志:

10-16 06:34:42.539 25428-25428/? I/art: Not late-enabling -Xcheck:jni (already on)
10-16 06:34:42.563 25428-25436/? E/art: Failed writing handshake bytes (-1 of 14): Broken pipe
10-16 06:34:42.563 25428-25436/? I/art: Debugger is no longer active
10-16 06:34:42.696 25428-25428/? D/AndroidRuntime: Shutting down VM  
10-16 06:34:42.696 25428-25428/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.sabirmoglad.big_boss, PID: 25428
java.lang.NoClassDefFoundError: Failed resolution of: Lbolts/TaskCompletionSource;
   at com.parse.ParseTaskUtils.callbackOnMainThreadAsync(ParseTaskUtils.java:100)
   at com.parse.ParseTaskUtils.callbackOnMainThreadAsync(ParseTaskUtils.java:72)
   at com.parse.ParseTaskUtils.callbackOnMainThreadAsync(ParseTaskUtils.java:59)
   at com.parse.ParseObject.saveInBackground(ParseObject.java:1529)
   at com.example.sabirmoglad.big_boss.MainActivity.onCreate(MainActivity.java:31)
   at android.app.Activity.performCreate(Activity.java:5937)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
   at android.app.ActivityThread.access0(ActivityThread.java:144)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5221)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.ClassNotFoundException: Didn't find class "bolts.TaskCompletionSource" on path: DexPathList[[zip file "/data/app/com.example.sabirmoglad.big_boss-2/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
   at com.parse.ParseTaskUtils.callbackOnMainThreadAsync(ParseTaskUtils.java:100) 
   at com.parse.ParseTaskUtils.callbackOnMainThreadAsync(ParseTaskUtils.java:72) 
   at com.parse.ParseTaskUtils.callbackOnMainThreadAsync(ParseTaskUtils.java:59) 
   at com.parse.ParseObject.saveInBackground(ParseObject.java:1529) 
   at com.example.sabirmoglad.big_boss.MainActivity.onCreate(MainActivity.java:31) 
   at android.app.Activity.performCreate(Activity.java:5937) 
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
   at android.app.ActivityThread.access0(ActivityThread.java:144) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:135) 
   at android.app.ActivityThread.main(ActivityThread.java:5221) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:372) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Suppressed: java.lang.ClassNotFoundException: bolts.TaskCompletionSource
   at java.lang.Class.classForName(Native Method)
   at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
   at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 19 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

我不知道出了什么问题!我刚遇到运行时错误,它停止工作


更新:

按照评论中的建议,我将初始化放在我的应用程序中 class,
事实上,我从原始 SDK 中复制了 class,但似乎没有执行此初始化,

这里是class我从原来的SDK中添加的:

public class StarterApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // Enable Local Datastore.
        Parse.enableLocalDatastore(this);

        // Add your initialization code here
        Parse.initialize(new Parse.Configuration.Builder(getApplicationContext())
                .applicationId("kooora.com100plus")
                .clientKey("kooora.com100plusMasterKey")
                .server("http://10.0.2.2:1337/parse/")
        .build()
        );

          ParseUser.enableAutomaticUser();
        ParseACL defaultACL = new ParseACL();
        // Optionally enable public read access.
        // defaultACL.setPublicReadAccess(true);
        ParseACL.setDefaultACL(defaultACL, true);
    }

}

首先,没有必要将这两行 libs 添加到 Gradle 文件中。这一行本身包括所有 JAR 文件。

compile fileTree(dir: 'libs', include: ['*.jar'])

现在,当您可以在 JCenter 或 Maven Central 中找到依赖项时,我通常建议您尽量避免使用 JAR 库(如果您不确定,请查找这些依赖项)。原因是 - 为您包含传递依赖项,版本管理需要一些数字更改,而不是覆盖文件等。

然后,Class 未找到错误可能源于使用过时版本的库。

总而言之,删除JAR 文件,使用这些依赖项编译库。 (以上评论中的最新版本)

dependencies {
    // other stuff 

    compile 'com.parse:parse-android:1.13.1'
    compile 'com.parse.bolts:bolts-tasks:1.4.0'
    compile 'com.parse.bolts:bolts-applinks:1.4.0'
}