ActiveAndroid 错误 - 编译时没有这样的 table - 仅在选择数据时
ActiveAndroid Error - No such table while compiling - Only when selecting data
我有两个带注释的 ActiveAndroid 模型 类,Term 和 Course(一对多关系)。
我能够创建 Term 和 Course 对象并在它们上调用 .save() 而不会出现任何错误。
但是,当我尝试在直接访问其成员之外查询对象时,收到错误消息:
no such table: Terms (code 1 SQLITE_ERROR):, while compiling: SELECT * FROM Terms ORDER BY RANDOM()
如果我尝试查询课程,则类似。
据我所知,我没有更改架构。
我尝试过的事情:
1.在模拟器中卸载并重新安装应用程序。
2. 更改 Android 清单中的 AA_DB_VERSION。
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gilbertdev.wgu.c196.abm1">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="AA_MODELS"
android:value="com.gilbertdev.wgu.c196.abm1.Term, com.gilbertdev.wgu.c196.abm1.Course" />
<meta-data android:name="AA_DB_VERSION" android:value="10" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
依赖关系:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation files('libs/activeandroid-3.0.jar')
}
Term.java
package com.gilbertdev.wgu.c196.abm1;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import java.util.Date;
@Table(name = "Terms")
public class Term extends Model {
@Column(name = "title")
public String title;
@Column(name = "startdate")
public Date startdate;
@Column(name = "enddate")
public Date enddate;
//@Column(name = "course")
//public Course course;
public Term () {
super();
}
}
Course.java
package com.gilbertdev.wgu.c196.abm1;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import java.util.Date;
@Table(name = "Courses")
public class Course extends Model {
@Column(name = "title")
public String title;
@Column(name = "startdate")
public Date startdate;
@Column(name = "enddate")
public Date enddate;
@Column(name = "status")
public String status;
@Column(name = "term")
public Term term;
public Course() {
super();
}
}
MainActivity.java
package com.gilbertdev.wgu.c196.abm1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.activeandroid.ActiveAndroid;
import com.activeandroid.Model;
import com.activeandroid.query.Select;
import java.util.Date;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView testView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActiveAndroid.initialize(this);
setContentView(R.layout.activity_main);
testView = (TextView) findViewById(R.id.testtext);
testView.append("\nGilbert\n");
Term firstterm = new Term();
firstterm.title = "First term";
firstterm.startdate = new Date(1991, 2, 20);
firstterm.enddate = new Date(2100, 2, 20);
firstterm.save();
Course firstcourse = new Course();
firstcourse.title = "First course";
firstcourse.startdate = new Date(2018, 1, 13);
firstcourse.enddate = new Date(2018, 1, 20);
firstcourse.status = "In Progress";
firstcourse.term = firstterm;
firstcourse.save();
testView.append(firstterm.title + "\n");
testView.append(firstterm.startdate + "\n");
testView.append(firstcourse.term.title + "\n");
try {
List<Course> courses = new Select()
.from(Course.class)
.where("Term = ?", firstterm.getId())
.orderBy("title ASC")
.execute();
for (Course course : courses) {
testView.append(course.status);
}
// Term test = new Select().from(Term.class).orderBy("RANDOM()").executeSingle();
// testView.append(test.title);
} catch (Exception e) {
testView.append(e.getMessage());
}
}
}
我尝试了另一个 ORM 并遇到了同样的问题,所以我认为发生了一些奇怪的事情,这不是 ActiveAndroid 特有的。我在 Android Studio 中使用 Device File Explorer 复制由两个 ORM 创建的 SQLite DB 文件,打开它们后发现没有创建任何表,并且在调用 .save()
后没有数据被保留
如何修复:
- 在 Android Studio
中禁用 Instant 运行
在 Mac 上,导航到 Android Studio -> 首选项 -> 构建、执行、部署 -> Instant 运行,然后取消选中启用 Instant 运行。
- 清除您现有的数据库文件,以便您的 ORM 可以重建它们
您可以在 Android Studio 中通过导航至视图 -> 工具 Windows -> 设备文件资源管理器,然后 data/data/com.yoursite.yourapp/databases 和删除任何相关的 .db 文件。
我有两个带注释的 ActiveAndroid 模型 类,Term 和 Course(一对多关系)。
我能够创建 Term 和 Course 对象并在它们上调用 .save() 而不会出现任何错误。
但是,当我尝试在直接访问其成员之外查询对象时,收到错误消息:
no such table: Terms (code 1 SQLITE_ERROR):, while compiling: SELECT * FROM Terms ORDER BY RANDOM()
如果我尝试查询课程,则类似。
据我所知,我没有更改架构。
我尝试过的事情: 1.在模拟器中卸载并重新安装应用程序。 2. 更改 Android 清单中的 AA_DB_VERSION。
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gilbertdev.wgu.c196.abm1">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="AA_MODELS"
android:value="com.gilbertdev.wgu.c196.abm1.Term, com.gilbertdev.wgu.c196.abm1.Course" />
<meta-data android:name="AA_DB_VERSION" android:value="10" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
依赖关系:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation files('libs/activeandroid-3.0.jar')
}
Term.java
package com.gilbertdev.wgu.c196.abm1;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import java.util.Date;
@Table(name = "Terms")
public class Term extends Model {
@Column(name = "title")
public String title;
@Column(name = "startdate")
public Date startdate;
@Column(name = "enddate")
public Date enddate;
//@Column(name = "course")
//public Course course;
public Term () {
super();
}
}
Course.java
package com.gilbertdev.wgu.c196.abm1;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import java.util.Date;
@Table(name = "Courses")
public class Course extends Model {
@Column(name = "title")
public String title;
@Column(name = "startdate")
public Date startdate;
@Column(name = "enddate")
public Date enddate;
@Column(name = "status")
public String status;
@Column(name = "term")
public Term term;
public Course() {
super();
}
}
MainActivity.java
package com.gilbertdev.wgu.c196.abm1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.activeandroid.ActiveAndroid;
import com.activeandroid.Model;
import com.activeandroid.query.Select;
import java.util.Date;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView testView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActiveAndroid.initialize(this);
setContentView(R.layout.activity_main);
testView = (TextView) findViewById(R.id.testtext);
testView.append("\nGilbert\n");
Term firstterm = new Term();
firstterm.title = "First term";
firstterm.startdate = new Date(1991, 2, 20);
firstterm.enddate = new Date(2100, 2, 20);
firstterm.save();
Course firstcourse = new Course();
firstcourse.title = "First course";
firstcourse.startdate = new Date(2018, 1, 13);
firstcourse.enddate = new Date(2018, 1, 20);
firstcourse.status = "In Progress";
firstcourse.term = firstterm;
firstcourse.save();
testView.append(firstterm.title + "\n");
testView.append(firstterm.startdate + "\n");
testView.append(firstcourse.term.title + "\n");
try {
List<Course> courses = new Select()
.from(Course.class)
.where("Term = ?", firstterm.getId())
.orderBy("title ASC")
.execute();
for (Course course : courses) {
testView.append(course.status);
}
// Term test = new Select().from(Term.class).orderBy("RANDOM()").executeSingle();
// testView.append(test.title);
} catch (Exception e) {
testView.append(e.getMessage());
}
}
}
我尝试了另一个 ORM 并遇到了同样的问题,所以我认为发生了一些奇怪的事情,这不是 ActiveAndroid 特有的。我在 Android Studio 中使用 Device File Explorer 复制由两个 ORM 创建的 SQLite DB 文件,打开它们后发现没有创建任何表,并且在调用 .save()
后没有数据被保留如何修复:
- 在 Android Studio 中禁用 Instant 运行
在 Mac 上,导航到 Android Studio -> 首选项 -> 构建、执行、部署 -> Instant 运行,然后取消选中启用 Instant 运行。
- 清除您现有的数据库文件,以便您的 ORM 可以重建它们
您可以在 Android Studio 中通过导航至视图 -> 工具 Windows -> 设备文件资源管理器,然后 data/data/com.yoursite.yourapp/databases 和删除任何相关的 .db 文件。