feat(face): 支持按userFaceId查询单条人脸记录
- FaceDao新增queryByUserFaceId接口,实现按userFaceId精确查询 - FaceApi新增queryByUserFaceId方法,封装Dao查询逻辑 - LoginByFaceActivity插入人脸时,先按userFaceId查询,存在则更新避免重复 - NetViewModelV2同步人脸数据时,优先用userFaceId判重,减少重复入库 - 修正FaceEntity中userId字段数据库列名错误(user_id替代user_idd) - 增加注释说明及代码格式优化,提升代码可读性和健壮性
This commit is contained in:
@@ -1018,7 +1018,17 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
|||||||
loadLogInfo("collectFace,saveFaceInfo: ----------8,保存人脸取特征数据-----------")
|
loadLogInfo("collectFace,saveFaceInfo: ----------8,保存人脸取特征数据-----------")
|
||||||
val faceDao = FaceDatabase.getInstance(this).faceDao()
|
val faceDao = FaceDatabase.getInstance(this).faceDao()
|
||||||
val faceEntity = faceModel.toFaceEntity()
|
val faceEntity = faceModel.toFaceEntity()
|
||||||
val faceId = faceDao.insert(faceEntity)
|
// 先查后插:按 userFaceId 判重,避免采集入库与增量同步各插一条
|
||||||
|
val userFaceId = faceModel.userFaceId
|
||||||
|
val existing = if (!userFaceId.isNullOrEmpty()) faceDao.queryByUserFaceId(userFaceId) else null
|
||||||
|
val faceId = if (existing != null) {
|
||||||
|
// 已存在记录,更新特征等字段并复用主键,避免重复
|
||||||
|
faceEntity.faceId = existing.faceId
|
||||||
|
faceDao.updateFaceEntity(faceEntity)
|
||||||
|
existing.faceId
|
||||||
|
} else {
|
||||||
|
faceDao.insert(faceEntity)
|
||||||
|
}
|
||||||
faceEntity.faceId = faceId
|
faceEntity.faceId = faceId
|
||||||
loadLogInfo("collectFace,saveFaceInfo: ----------10,人脸数据保存完成-----------")
|
loadLogInfo("collectFace,saveFaceInfo: ----------10,人脸数据保存完成-----------")
|
||||||
recognizeViewModel.refreshFaceList()
|
recognizeViewModel.refreshFaceList()
|
||||||
|
|||||||
@@ -232,12 +232,18 @@ class NetViewModelV2 : ViewModel() {
|
|||||||
faceApi.deleteByUserFaceId(userFaceId)
|
faceApi.deleteByUserFaceId(userFaceId)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 获取该用户所有已存特征,判断当前特征是否已存在
|
// 优先按 userFaceId 精确判重,避免特征字段不一致导致重复入库
|
||||||
|
val userFaceId = model.userFaceId
|
||||||
|
if (!userFaceId.isNullOrEmpty() && faceApi.queryByUserFaceId(userFaceId) != null) {
|
||||||
|
// 本地已存在该 userFaceId,跳过插入
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
|
// userFaceId 为空时,回退到特征比较去重(修正字段来源,保证与入库一致)
|
||||||
|
val featureStr = model.resolveFeatureStr()
|
||||||
val existList = faceApi.queryAllByUserName(model.userId)
|
val existList = faceApi.queryAllByUserName(model.userId)
|
||||||
val featureMatches =
|
val alreadyExists = existList.any { entity ->
|
||||||
existList.map { Base64.encode(it.featureData) == model.faceFeatureStr }
|
featureStr != null && Base64.encode(entity.featureData) == featureStr
|
||||||
Timber.d("userId=${model.userId}, 已存记录数=${existList.size}, 各条特征是否与服务器一致=$featureMatches")
|
}
|
||||||
val alreadyExists = featureMatches.any { it }
|
|
||||||
if (!alreadyExists) {
|
if (!alreadyExists) {
|
||||||
faceApi.insert(model.toFaceEntity())
|
faceApi.insert(model.toFaceEntity())
|
||||||
}
|
}
|
||||||
|
|||||||
+1272
File diff suppressed because it is too large
Load Diff
@@ -98,6 +98,17 @@ public class FaceApi {
|
|||||||
getFaceDao().deleteFaceByUserFaceId(userFaceId);
|
getFaceDao().deleteFaceByUserFaceId(userFaceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按 userFaceId 查询单条人脸记录
|
||||||
|
*/
|
||||||
|
public FaceEntity queryByUserFaceId(String userFaceId) {
|
||||||
|
if (userFaceId == null || userFaceId.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getFaceDao().queryByUserFaceId(userFaceId);
|
||||||
|
}
|
||||||
|
|
||||||
public Long insert(FaceEntity entity) {
|
public Long insert(FaceEntity entity) {
|
||||||
if (entity == null) {
|
if (entity == null) {
|
||||||
return 0L;
|
return 0L;
|
||||||
|
|||||||
@@ -61,6 +61,12 @@ public interface FaceDao {
|
|||||||
@Query("DELETE from face WHERE user_face_id = :userFaceId")
|
@Query("DELETE from face WHERE user_face_id = :userFaceId")
|
||||||
int deleteFaceByUserFaceId(String userFaceId);
|
int deleteFaceByUserFaceId(String userFaceId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按 userFaceId 查询单条人脸记录
|
||||||
|
*/
|
||||||
|
@Query("SELECT * FROM face WHERE user_face_id = :userFaceId LIMIT 1")
|
||||||
|
FaceEntity queryByUserFaceId(String userFaceId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除所有已注册的人脸
|
* 删除所有已注册的人脸
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public class FaceEntity implements Parcelable {
|
|||||||
@Ignore
|
@Ignore
|
||||||
private int trackId;//人脸追踪ID
|
private int trackId;//人脸追踪ID
|
||||||
|
|
||||||
@ColumnInfo(name = "user_idd")
|
@ColumnInfo(name = "user_id")
|
||||||
private String userId;
|
private String userId;
|
||||||
@ColumnInfo(name = "user_face_id")
|
@ColumnInfo(name = "user_face_id")
|
||||||
private String userFaceId;
|
private String userFaceId;
|
||||||
|
|||||||
Reference in New Issue
Block a user