我是第一次使用Room.我正在看一下LiveData概念.我知道我们可以从DB获取记录到LiveData和附加的hasObservers.
@Query("SELECT * FROM users")
<LiveData<List<TCUser>> getAll();
Run Code Online (Sandbox Code Playgroud)
但是我在后台执行同步,我需要从服务器获取数据并将其与RoomDatabase表中名为"users"的数据进行比较,然后从users表中插入,更新或删除.如何在采取任何行动之前遍历LiveData列表?因为如果我把它放入for循环它会给出错误.
或者我不应该在这种情况下使用LiveData吗?
我想我需要打电话
<LiveData<List<TCUser>> getAll().getValue()
Run Code Online (Sandbox Code Playgroud)
但这是正确的做法吗?这里有一些代码可以说明我想要做的事情:
List<User>serverUsers: Is the data received from a response from an API
private void updateUsers(List<User> serverUsers) {
List<UserWithShifts> users = appDatabase.userDao().getAllUsers();
HashMap<String, User> ids = new HashMap();
HashMap<String, User> newIds = new HashMap();
if (users != null) {
for (UserWithShifts localUser : users) {
ids.put(localUser.user.getId(), localUser.user);
}
}
for (User serverUser : serverUsers) {
newIds.put(serverUser.getId(), serverUser);
if (!ids.containsKey(serverUser.getId())) {
saveShiftForUser(serverUser);
} else {
User existingUser = ids.get(serverUser.getId());
//If …
Run Code Online (Sandbox Code Playgroud) 我正在使用SQLCipher for Android.我已经完成了加载lib所需的所有必要的东西,如http://sqlcipher.net/sqlcipher-for-android/中所述
我发现你设置密码即密钥:
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
Run Code Online (Sandbox Code Playgroud)
那么你的密码如何从黑客那里获得安全保障?因为它可以从java文件中访问.?
有没有正确的方法可以存储密码?
谢谢,Nibs
c 我已经加密和解密了存储在 Android Keystore 中的登录密码。在 Android 9 上,我观察到应用程序在尝试解密密码时崩溃(我无法重现它,但拥有 Pixel 3 的人是崩溃的设备之一)。下面是我从密钥库解密密码的方法。
private static final String TRANSFORMATION = "AES/GCM/NoPadding";
private static final String ANDROID_KEY_STORE = "AndroidKeyStore";
private KeyStore keyStore;
public Decryptor() throws CertificateException, NoSuchAlgorithmException, KeyStoreException,
IOException {
initKeyStore();
}
private void initKeyStore() throws KeyStoreException, CertificateException,
NoSuchAlgorithmException, IOException {
keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
}
@TargetApi(19)
public String decryptData(final String alias, final byte[] encryptedData, final byte[] encryptionIv)
throws UnrecoverableEntryException, NoSuchAlgorithmException, KeyStoreException,
NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IOException,
BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
final Cipher cipher = …
Run Code Online (Sandbox Code Playgroud) security encryption android android-keystore android-9.0-pie
这是我第一次使用 Room。我有一个班级叫:
@Entity(tableName = "users")
class User{
@PrimaryKey
@ColumnInfo(name = "id")
@SerializedName("id")
String id;
@ColumnInfo(name = "name")
@SerializedName("name")
String name;
@SerializedName("shift")
@Ignore
List<Shift> shifts;
}
@Entity(tableName = "shifts")
class Shift{
@PrimaryKey
@ColumnInfo(name = "id")
@SerializedName("id")
String id;
@ColumnInfo(name = "start_time")
@SerializedName("start_time")
String startTime;
@ColumnInfo(name = "end_time")
@SerializedName("end_time")
String endTime;
}
Run Code Online (Sandbox Code Playgroud)
我希望这两个是数据库中的单独表,因此我不能使用 @Embedded 注释,因为它将创建一个使用所有字段作为列的表。我也在使用上面的 User 类来存储来自服务器的 json 响应,在那里我在 json 对象中获取用户和转移详细信息。
有什么方法可以在用户表中插入用户详细信息后立即在班次表中插入班次详细信息?我最初认为这将使用 @Embeded 处理,但这会在用户表中创建我不想要的移位表列。
有人可以帮助我了解我应该如何在 Room Persistence Library 中处理这个问题。类似的,我也必须删除。
谢谢
我最近将我的项目移到了 AndroidX,在为应用程序实现指纹时,我使用了 AndroidX 的生物识别技术。
implementation 'androidx.biometric:biometric:1.0.0-alpha03'
Run Code Online (Sandbox Code Playgroud)
当显示使用指纹进行身份验证的对话框时,该对话框将“取消”选项设置为否定按钮。
final BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
.setTitle("Log into App")
.setSubtitle("Please touch the fingerprint sensor to log you in")
.setDescription("Touch Sensor")
.setNegativeButtonText("Cancel".toUpperCase())
.build();
Run Code Online (Sandbox Code Playgroud)
根据android文档:https : //developer.android.com/reference/androidx/biometric/BiometricPrompt.PromptInfo.Builder.html#setNegativeButtonText(java.lang.CharSequence)
Required: Set the text for the negative button.
This would typically be used as a "Cancel" button, but may be also used
to show an alternative method for authentication,
such as screen that asks for a backup password.
Run Code Online (Sandbox Code Playgroud)
因此,代替“取消”按钮,我可以说“使用密码”来提供另一种方法,以防指纹失败,当用户点击它时,我可以显示另一个弹出对话框,让用户输入设备密码以帮助检索应用程序密码从密钥库。这样对吗 ?
但是,如果我没有设置密码来解锁手机,而是使用图案,会发生什么?
我看到如果我使用 android.hardware.biometrics.BiometricPrompt.Builder 而不是 androidx.biometric.BiometricPrompt.PromptInfo.Builder,它有一个方法https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt .Builder.html#setDeviceCredentialAllowed(boolean) …
android fingerprint android-fingerprint-api androidx android-biometric-prompt
我迁移到 Firebase Crashlytics SDK。调试应用程序工作正常,Crashlytics 被初始化,当发生崩溃时,重新启动应用程序后,它将崩溃上传到 https://crashlyticsreports-pa.googleapis.com。
但是当我创建一个发布 apk 时,Crashlytics 确实被初始化但日志没有被上传。
我正在使用 com.google.firebase:firebase-crashlytics-gradle:2.3.0
调试后的一些日志:
10-14 17:47:42.803 10335 10723 D FirebaseCrashlytics: Executing shutdown hook for Crashlytics Exception Handler
10-14 17:47:42.804 10335 10724 D FirebaseCrashlytics: Executing shutdown hook for com.google.firebase.crashlytics.startup
10-14 17:47:42.808 10335 10725 D FirebaseCrashlytics: Executing shutdown hook for awaitEvenIfOnMainThread task continuation executor
10-14 17:47:50.523 10755 10755 D FirebaseCrashlytics: Crashlytics automatic data collection ENABLED by API.
10-14 17:47:50.523 10755 10755 D FirebaseCrashlytics: Firebase Analytics is available.
10-14 17:47:50.523 10755 10755 D …
Run Code Online (Sandbox Code Playgroud) 我有一些html文件res/raw
,我在其中打开WebView
.但是在混淆之后他们无法加载.
我正在尝试从 Android 设备上传 JPEG 图像文件。我正在使用该square/okhttp
库来创建请求。我在联想 Yoga 平板电脑上遇到了这个问题,当我尝试上传图像时,出现以下异常。但是,当我在 Samsung Galaxy Tab 10" 上运行相同的代码时,一切正常,图像上传成功。
相机捕获图像并将其存储在 /storage/emulated/0/ 中,应用程序将从此处获取图像并尝试上传。我有一个在后台运行的服务来执行上传。
final MediaType MEDIA_TYPE_IMAGE_JPEG = MediaType.parse("image/jpeg");
File file = new File(path);
Request request = new Request.Builder()
.url(baseUrl)
.addHeader("timestamp", map.get("timestamp"))
.addHeader("Content-Type", map.get("Content-Type"))
.post(RequestBody.create(MEDIA_TYPE_IMAGE_JPEG, file))
.build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
Run Code Online (Sandbox Code Playgroud)
例外:
java.net.SocketTimeoutException: timeout
11-27 15:37:06.394 1770-2339/com.myapp.app.debug
W/System.err: at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException(Http2
Stream.java:593)
11-27 15:37:06.394 1770-2339/com.myapp.app.debug
W/System.err: at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut(Http2Stream.java:601)
11-27 15:37:06.394 1770-2339/com.myapp.app.debug
W/System.err: at okhttp3.internal.http2.Http2Stream.takeResponseHeaders(Http2Stream.java:146)
11-27 15:37:06.394 1770-2339/com.myapp.app.debug
W/System.err: at okhttp3.internal.http2.Http2Codec.readResponseHeaders(Http2Codec.java:125)
11-27 15:37:06.394 1770-2339/com.myapp.app.debug …
Run Code Online (Sandbox Code Playgroud) 我需要通过脉冲动画显示位置 A 和位置 B。我可以使用下面的代码来实现这一点。但我面临的问题是,当缩放级别发生变化时,GroundOverlay 也会改变其大小。如果位置A和B彼此靠近(即地图放大级别较高),则脉冲半径太大。当我缩小时,它变得太小了。
无论地图的缩放级别如何,如何保持叠加层的大小相同。
下面的代码是从这里引用的:Google Maps v2 上的动画透明圆没有正确动画化
private void showRipples(LatLng latLng, int color) {
GradientDrawable d = new GradientDrawable();
d.setShape(GradientDrawable.OVAL);
d.setSize(500, 500);
d.setColor(ContextCompat.getColor(Activity.this, color));
d.setStroke(0, Color.TRANSPARENT);
final Bitmap bitmap = Bitmap.createBitmap(d.getIntrinsicWidth()
, d.getIntrinsicHeight()
, Bitmap.Config.ARGB_8888);
// Convert the drawable to bitmap
final Canvas canvas = new Canvas(bitmap);
d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
d.draw(canvas);
// Radius of the circle
final int radius = getResources().getDimensionPixelSize(R.dimen.ripple_radius);
// Add the circle to the map
final GroundOverlay circle = googleMap.addGroundOverlay(new GroundOverlayOptions()
.position(latLng, …
Run Code Online (Sandbox Code Playgroud) 没有太多文档可以了解 runInTransaction() 方法到底如何工作。在不同的 DAO 上执行多个操作时,如果不返回任何值,我可以使用runInTransaction(Runnable body)
ORrunInTransaction(Callable<V> body)
如果要返回任何结果,
我的查询: 如果事务中的所有查询都成功,那么我想返回一个图像对象,需要在事务成功时将其上传到服务器如果发生任何异常或事务不成功,我需要返回一个布尔值false 指示用户发生了某些错误。
方法如下:
public boolean userCheckedIn(final User user) {
try {
appDatabase.runInTransaction(new Callable<Object>() {
@Override
public Object call() throws Exception {
if (user != null) {
//Add entry in table A
appDatabase.UserDao().add(user);
//Update entry in table B
//Delete an entry from table C
Event image = updateUserAction(action);
return image;
}
return null;
}
});
} catch (Exception e) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
在上面的方法中,我打算做的是,如果所有数据库执行都成功,我需要返回一个将上传到服务器的图像。如果在执行数据库事务时发生任何异常或发生任何错误,我需要返回false
以让用户知道发生了错误。不确定我是否做对了。另外,我应该将 …
android ×10
android-room ×3
androidx ×1
animation ×1
callable ×1
crashlytics ×1
database ×1
encryption ×1
fingerprint ×1
firebase ×1
google-maps ×1
okhttp3 ×1
proguard ×1
security ×1
sqlcipher ×1
sqlite ×1