我目前正在重构一些旧应用程序,并且正在尝试从 SQLite 迁移到 Realm。我以前用过 Realm,从来没有遇到过这样的问题。当我第一次启动我的应用程序时(安装后),我得到这个异常:
E/AndroidRuntime: FATAL EXCEPTION:
Process: xx.xxx.xxx.beta.realm, PID: 25947
java.lang.IllegalArgumentException: A RealmObject with no @PrimaryKey cannot be updated: class xx.xxx.xxx.realm.Vod
at io.realm.Realm.checkHasPrimaryKey(Realm.java:1184)
at io.realm.Realm.copyToRealmOrUpdate(Realm.java:713)
at xx.xxx.xxx.services.VodService$4.run(VodService.java:232)
at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)
我的 Vod 类看起来像这样,并且对象已正确创建,即具有 PrimaryKey 和所有其他字段的值:
public class Vod extends RealmObject {
@PrimaryKey
private String uuid;
private String name;
private Integer lengthMin;
private Boolean hasTrailer;
private String description;
private String originalName;
//etc...
//getters & setters
Run Code Online (Sandbox Code Playgroud)
这将使应用程序崩溃。但是在第一次(以及每一次)之后,一切正常——使用相同的代码和相同的数据。但是当我再次卸载并重新安装应用程序时,我也会再次遇到此异常。有问题的代码部分在后台线程上运行。如果我将它移动到 UI 线程,即使是第一次也一切正常。但我想在后台线程而不是 UI 上解析网络响应。此外,它不是特定于 Vod 类的,如果我跳过 Vod 的数据并从例如 User 类开始,那么我会收到 User 类的“无@PrimaryKey”异常。
有时它也会抛出这个异常:
D/REALM: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 WebRTC 制作屏幕共享应用程序。我有可以从相机获取和共享视频流的代码。我需要修改它以通过 MediaProjection API 获取视频。基于这篇文章,我修改了代码以使用 org.webrtc.ScreenCapturerAndroid,但没有显示视频输出。只有黑屏。如果我使用相机,一切正常(我可以在屏幕上看到相机输出)。有人可以检查我的代码并指出我正确的方向吗?我已经被这个问题困住了三天了。
\n\n这是我的代码:
\n\npublic class MainActivity extends AppCompatActivity {\n\n private static final String TAG = "VIDEO_CAPTURE";\n\n private static final int CAPTURE_PERMISSION_REQUEST_CODE = 1;\n private static final String VIDEO_TRACK_ID = "video_stream";\n\n PeerConnectionFactory peerConnectionFactory;\n\n SurfaceViewRenderer localVideoView;\n ProxyVideoSink localSink;\n\n VideoSource videoSource;\n VideoTrack localVideoTrack;\n\n EglBase rootEglBase;\n\n boolean camera = false;\n\n @Override\n protected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_main);\n\n rootEglBase = EglBase.create();\n localVideoView = findViewById(R.id.local_gl_surface_view);\n\n localVideoView.init(rootEglBase.getEglBaseContext(), null);\n\n startScreenCapture();\n }\n\n @TargetApi(21)\n private void startScreenCapture() {\n MediaProjectionManager mMediaProjectionManager …Run Code Online (Sandbox Code Playgroud)