虽然这个问题与ActiveAndroid有关,但任何熟悉ORM的人都可以回答这个问题.
ActiveAndroid似乎没有为您提供开箱即用的多对多关系的方法.我在寻找解决方案时发现的是这个GitHub问题:https://github.com/pardom/ActiveAndroid/issues/46
我知道它是显式创建关系表,但我不明白以下部分应该如何做有用的事情:
public List<Foo> foos() {
return getMany(Foo.class, "FooBar");
}
public List<Bar> bars() {
return getMany(Bar.class, "FooBar");
}
Run Code Online (Sandbox Code Playgroud)
这将导致类似的查询SELECT * FROM Foo where Foo.FooBar = FooBar.Id;.这最多只返回Foo一行.我错过了什么吗?
你不需要涉及连接的查询吗?
正如标题所说.我知道robolectric提供的内存数据库有限.有没有办法在Active Android中使用它?在默认配置下,似乎在运行所有测试后清除数据库,但不是每个测试都清除.
我有一个使用Android Studio和Gradle开发的应用程序.该应用程序使用ActiveAndroid.该应用程序在3.0及以上完美运行.当在Gingerbread设备上运行时,它只会打开,白屏,然后自动关闭.运行应用程序时,logcat中给出的唯一线索如下:
D/dalvikvm? GC_CONCURRENT freed 195K, 41% free 3988K/6663K, external 1625K/2137K, paused 0ms+0ms
I/dalvikvm? Failed resolving Landroid/support/v4/media/TransportMediatorJellybeanMR2$1; interface 1088 'Landroid/view/ViewTreeObserver$OnWindowAttachListener;'
W/dalvikvm? Link of class 'Landroid/support/v4/media/TransportMediatorJellybeanMR2$1;' failed
I/dalvikvm? Failed resolving Landroid/support/v4/media/TransportMediatorJellybeanMR2$2; interface 1089 'Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;'
W/dalvikvm? Link of class 'Landroid/support/v4/media/TransportMediatorJellybeanMR2$2;' failed
I/dalvikvm? Failed resolving Landroid/support/v4/media/TransportMediatorJellybeanMR2; interface 180 'Landroid/media/RemoteControlClient$OnGetPlaybackPositionListener;'
W/dalvikvm? Link of class 'Landroid/support/v4/media/TransportMediatorJellybeanMR2;' failed
I/dalvikvm? Failed resolving Landroid/support/v4/os/ParcelableCompatCreatorHoneycombMR2; interface 224 'Landroid/os/Parcelable$ClassLoaderCreator;'
W/dalvikvm? Link of class 'Landroid/support/v4/os/ParcelableCompatCreatorHoneycombMR2;' failed
W/dalvikvm? Unable to resolve superclass of Landroid/support/v4/print/PrintHelperKitkat$1; (241)
W/dalvikvm? Link of class 'Landroid/support/v4/print/PrintHelperKitkat$1;' failed
I/dalvikvm? …Run Code Online (Sandbox Code Playgroud) 谢谢你的阅读和帮助:)
我正在使用ActiveAndroid 3.0 - Android 2.2 - 在我的应用程序中,我有一个名为"用户"的模型.最初我只使用(id,name,passcode)列/属性创建了模型,我在模拟器上运行了应用程序,并且它工作正常.
@Table(name = "user")
public class User extends Model {
@Column (name = "name")
public String name;
@Column (name = "pass_code")
public String passCode;
}
Run Code Online (Sandbox Code Playgroud)
然后我添加了一个新的列/属性 - profileImage.我在模拟器上运行应用程序,我得到SQLite列profileImage不存在错误.
@Table(name = "user")
public class User extends Model {
@Column (name = "name")
public String name;
@Column (name = "pass_code")
public String passCode;
@Column (name = "profile_image")
public String profileImage;
}
Run Code Online (Sandbox Code Playgroud)
我尝试更改ActiveAndroid数据库名称并更新清单文件中的数据库版本属性.
<meta-data android:name="AA_DB_NAME" android:value="my_app.db" />
<meta-data android:name="AA_DB_VERSION" android:value="2" />
Run Code Online (Sandbox Code Playgroud)
但我不断得到列不存在错误.
ERROR AndroidRuntime Caused by: …Run Code Online (Sandbox Code Playgroud) 我想使用AA_MODEL标记在AndroidManifest.xml文件中定义我的模型类并禁用自动搜索.因为当前我在应用程序启动时遇到错误类似于:
Couldn't create class.
java.lang.ClassNotFoundException: android.support.v4.print.PrintHelperKitkat$1
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:204)
at com.activeandroid.ModelInfo.scanForModelClasses(Unknown Source)
at com.activeandroid.ModelInfo.scanForModel(Unknown Source)
at com.activeandroid.ModelInfo.<init>(Unknown Source)
at com.activeandroid.Cache.initialize(Unknown Source)
at com.activeandroid.ActiveAndroid.initialize(Unknown Source)
at com.activeandroid.ActiveAndroid.initialize(Unknown Source)
at com.company.myapp.app.MyAppApplication.onCreate(Unknown Source)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4684)
at android.app.ActivityThread.access$1400(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
怎么做得好?你能告诉我一个定义明确的AA_MODEL标签的例子吗?
我目前正在使用ActiveAndroid,过去几个小时一直试图让多对多的关系工作,但是我无法让它工作.我希望你能帮助我:
我有模特"学生"和"课程",学生可以有很多课程,课程有很多学生.基本上这就是我在模型"StudentCourse"中所拥有的:
@Column(name = COURSE)
public Course course;
@Column(name = STUDENT)
public Student student;
public StudentCourse(Student student, Course course) {
super();
this.student = student;
this.course = course;
}
//
public StudentCourse(){ }
public List<Course> courses(){
return getMany(Course.class, "StudentCourse");
}
public List<Student> students(){
return getMany(Student.class, "StudentCourse");
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试做的是"课程X中的所有学生",使用以下代码:
((Student) new Select().from(StudentCourse.class).where("course = ?",selectedCourse.getId()).executeSingle()).students();
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
java.lang.ClassCastException:com.papinotas.models.StudentCourse无法强制转换为com.papinotas.models.Student
如果我将(学生)的演员表更改为(StudentCourse),我会收到以下错误:
android.database.sqlite.SQLiteException:没有这样的专栏:students.StudentCourse(代码1):,同时编译:SELECT*FROM学生WHERE students.StudentCourse = 1
我的主要目标是希望在一个查询中实现这一点.任何帮助将不胜感激.提前致谢!
PS:我已经看过几乎所有我能找到的东西:活跃的Android多对多关系和https://github.com/pardom/ActiveAndroid/issues/46
我可以做些什么来在Robolectric上对ActiveAndroid的ContentProvider进行一些测试?这个简单的测试失败了
该模型:
@Table(name = "Things")
public class Thing extends Model {
public Thing() {
super();
}
}
Run Code Online (Sandbox Code Playgroud)
考试:
@RunWith(RobolectricTestRunner.class)
public class ContentProviderTest {
@Test
public void itShouldQuery() throws Exception {
new Thing().save();
ContentResolver cr = new MainActivity().getContentResolver();
assertNotNull(
cr.query(Uri.parse("content://org.example/things"),
null, null, null, null));
}
}
Run Code Online (Sandbox Code Playgroud)
生成的堆栈跟踪:
java.lang.NullPointerException: null
at com.activeandroid.Cache.getTableInfo(Unknown Source)
at com.activeandroid.Model.<init>(Unknown Source)
at org.example.Thing.<init>(Thing.java:9)
at org.example.ProviderTest.itShouldQuery(ProviderTest.java:25)
Run Code Online (Sandbox Code Playgroud)
应用程序上下文应该没问题.默认情况下,Robolectric创建清单中显示的应用程序,在本例中为com.activeandroid.Application.
所以,我很困惑为什么Cache中的tableInfo没有被初始化.正常的应用程序执行正常.
我想知道是否可能以及如何使用"IN"子句在ActiveAndroid中执行where子句.
例如,我想做这样的事情:
new Select().from(Table).where("id in?",list).execute()
我的ActiveAndroid数据库中有大约20-30个表.当我按下logoutButton我要清除所有表格.我怎么能这样做ActiveAndroid?
public void logOut() {
//clear all tables
}
Run Code Online (Sandbox Code Playgroud) Android 应用程序已使用 ActiveAndroid 开发
public static List<ModelNames> search(String pattern) {
return new Select().from(ModelNames.class)
.where("title LIKE '%" + pattern + "%' or content LIKE '%" + pattern + "%'")
.orderBy("title")
.execute();
}
Run Code Online (Sandbox Code Playgroud)
现在很容易出现 SQL 注入。
有没有人遇到过类似的问题并找到了解决方案,或者有人可以提供相同的解决方案吗?
在github上发现了一个问题,但无法得到正确的解决方案。
activeandroid ×10
android ×9
database ×2
robolectric ×2
sql ×2
sqlite ×2
java ×1
unit-testing ×1