Skip to content

Commit d11d9ab

Browse files
committed
Merge pull request yangfuhai#36 from lsjwzh/master
修复onClick事件绑定出错的bug,完善ManyToOne的懒加载
2 parents 7399f2c + 3dbb1bd commit d11d9ab

File tree

5 files changed

+44
-14
lines changed

5 files changed

+44
-14
lines changed

src/net/tsz/afinal/FinalActivity.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,23 +100,23 @@ public static void initInjectedView(Object injectedSource,View sourceView){
100100

101101
String clickMethod = viewInject.click();
102102
if(!TextUtils.isEmpty(clickMethod))
103-
setViewClickListener(sourceView,field,clickMethod);
103+
setViewClickListener(injectedSource,field,clickMethod);
104104

105105
String longClickMethod = viewInject.longClick();
106106
if(!TextUtils.isEmpty(longClickMethod))
107-
setViewLongClickListener(sourceView,field,longClickMethod);
107+
setViewLongClickListener(injectedSource,field,longClickMethod);
108108

109109
String itemClickMethod = viewInject.itemClick();
110110
if(!TextUtils.isEmpty(itemClickMethod))
111-
setItemClickListener(sourceView,field,itemClickMethod);
111+
setItemClickListener(injectedSource,field,itemClickMethod);
112112

113113
String itemLongClickMethod = viewInject.itemLongClick();
114114
if(!TextUtils.isEmpty(itemLongClickMethod))
115-
setItemLongClickListener(sourceView,field,itemLongClickMethod);
115+
setItemLongClickListener(injectedSource,field,itemLongClickMethod);
116116

117117
Select select = viewInject.select();
118118
if(!TextUtils.isEmpty(select.selected()))
119-
setViewSelectListener(sourceView,field,select.selected(),select.noSelected());
119+
setViewSelectListener(injectedSource,field,select.selected(),select.noSelected());
120120

121121
}
122122
}

src/net/tsz/afinal/FinalDb.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import net.tsz.afinal.db.sqlite.CursorUtils;
2727
import net.tsz.afinal.db.sqlite.DbModel;
28+
import net.tsz.afinal.db.sqlite.ManyToOneLazyLoader;
2829
import net.tsz.afinal.db.sqlite.OneToManyLazyLoader;
2930
import net.tsz.afinal.db.sqlite.SqlBuilder;
3031
import net.tsz.afinal.db.sqlite.SqlInfo;
@@ -370,7 +371,7 @@ public <T> T findWithManyToOneById(Object id ,Class<T> clazz){
370371
DbModel dbModel = findDbModelBySQL(sql);
371372
if(dbModel!=null){
372373
T entity = CursorUtils.dbModel2Entity(dbModel, clazz);
373-
return loadManyToOne(entity,clazz);
374+
return loadManyToOne(dbModel,entity,clazz);
374375
}
375376

376377
return null;
@@ -390,24 +391,33 @@ public <T> T findWithManyToOneById(Object id ,Class<T> clazz,Class<?> ... findCl
390391
DbModel dbModel = findDbModelBySQL(sql);
391392
if(dbModel!=null){
392393
T entity = CursorUtils.dbModel2Entity(dbModel, clazz);
393-
return loadManyToOne(entity,clazz,findClass);
394+
return loadManyToOne(dbModel,entity,clazz,findClass);
394395
}
395396
return null;
396397
}
397398

398399
/**
399400
* 将entity中的“多对一”的数据填充满
401+
* 如果是懒加载填充,则dbModel参数可为null
400402
* @param clazz
401403
* @param entity
402404
* @param <T>
403405
* @return
404406
*/
405-
public <T> T loadManyToOne(T entity,Class<T> clazz,Class<?> ... findClass) {
407+
public <T> T loadManyToOne(DbModel dbModel,T entity,Class<T> clazz,Class<?> ... findClass) {
406408
if(entity!=null){
407409
try {
408410
Collection<ManyToOne> manys = TableInfo.get(clazz).manyToOneMap.values();
409411
for(ManyToOne many : manys){
410-
Object id = many.getValue(entity);
412+
413+
Object id = null;
414+
if(dbModel!=null){
415+
id = dbModel.get(many.getColumn());
416+
}else if(many.getValue(entity).getClass()== ManyToOneLazyLoader.class
417+
&&many.getValue(entity)!=null){
418+
id = ((ManyToOneLazyLoader)many.getValue(entity)).getFieldValue();
419+
}
420+
411421
if(id!=null){
412422
boolean isFind = false;
413423
if(findClass == null || findClass.length==0){
@@ -420,10 +430,19 @@ public <T> T loadManyToOne(T entity,Class<T> clazz,Class<?> ... findClass) {
420430
}
421431
}
422432
if(isFind){
433+
423434
@SuppressWarnings("unchecked")
424-
T manyEntity = (T) findById(Integer.valueOf(id.toString()), many.getDataType());
435+
T manyEntity = (T) findById(Integer.valueOf(id.toString()), many.getManyClass());
425436
if(manyEntity!=null){
426-
many.setValue(entity, manyEntity);
437+
if(many.getValue(entity).getClass()== ManyToOneLazyLoader.class){
438+
if(many.getValue(entity)==null){
439+
many.setValue(entity,new ManyToOneLazyLoader(entity,clazz,many.getManyClass(),this));
440+
}
441+
((ManyToOneLazyLoader)many.getValue(entity)).set(manyEntity);
442+
}else{
443+
many.setValue(entity, manyEntity);
444+
}
445+
427446
}
428447
}
429448
}

src/net/tsz/afinal/db/sqlite/CursorUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public static <T> T getEntity(Cursor cursor, Class<T> clazz,FinalDb db){
6666
for(ManyToOne manyToOneProp : table.manyToOneMap.values()){
6767
if(manyToOneProp.getDataType()==ManyToOneLazyLoader.class){
6868
ManyToOneLazyLoader manyToOneLazyLoader = new ManyToOneLazyLoader(entity,clazz,manyToOneProp.getManyClass(),db);
69+
manyToOneLazyLoader.setFieldValue(cursor.getInt(cursor.getColumnIndex(manyToOneProp.getColumn())));
6970
manyToOneProp.setValue(entity,manyToOneLazyLoader);
7071
}
7172
}

src/net/tsz/afinal/db/sqlite/ManyToOneLazyLoader.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public class ManyToOneLazyLoader<M,O> {
1717
Class<M> manyClazz;
1818
Class<O> oneClazz;
1919
FinalDb db;
20+
/**
21+
* 用于
22+
*/
23+
private Object fieldValue;
2024
public ManyToOneLazyLoader(M manyEntity, Class<M> manyClazz, Class<O> oneClazz, FinalDb db){
2125
this.manyEntity = manyEntity;
2226
this.manyClazz = manyClazz;
@@ -32,7 +36,7 @@ public ManyToOneLazyLoader(M manyEntity, Class<M> manyClazz, Class<O> oneClazz,
3236
*/
3337
public O get(){
3438
if(oneEntity==null && !hasLoaded){
35-
this.db.loadManyToOne(this.manyEntity,this.manyClazz,this.oneClazz);
39+
this.db.loadManyToOne(null,this.manyEntity,this.manyClazz,this.oneClazz);
3640
hasLoaded = true;
3741
}
3842
return oneEntity;
@@ -41,4 +45,11 @@ public void set(O value){
4145
oneEntity = value;
4246
}
4347

48+
public Object getFieldValue() {
49+
return fieldValue;
50+
}
51+
52+
public void setFieldValue(Object fieldValue) {
53+
this.fieldValue = fieldValue;
54+
}
4455
}

src/net/tsz/afinal/db/sqlite/SqlBuilder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public class SqlBuilder {
3232

3333
/**
3434
* 获取插入的sql语句
35-
* @param tableInfo
3635
* @return
3736
*/
3837
public static SqlInfo buildInsertSql(Object entity){
@@ -370,7 +369,7 @@ private static KeyValue manyToOne2KeyValue(ManyToOne many , Object entity){
370369
if(manyobject!=null){
371370
Object manyvalue;
372371
if(manyobject.getClass()==ManyToOneLazyLoader.class){
373-
manyvalue = TableInfo.get(many.getManyClass()).getId().getValue(manyobject);
372+
manyvalue = TableInfo.get(many.getManyClass()).getId().getValue(((ManyToOneLazyLoader)manyobject).get());
374373
}else{
375374
manyvalue = TableInfo.get(manyobject.getClass()).getId().getValue(manyobject);
376375
}

0 commit comments

Comments
 (0)