由于无法在SQLite中使用"ALTER TABLE"语句添加外键,因此我坚持如何配置数据库以强制执行有效的外键,或执行级联删除而不显式代码开销.
任何人都知道如何在SQLite下使用ORMLite实现这一目标?
我想在三个表上创建一个内连接,例如:
SELECT C.Description, D.ItemDescription
FROM OrderDetailStatement AS D
INNER JOIN OrderHeaderStatement AS H
ON H.OrderHeaderStatementRefID = D.OrderHeaderStatementRefID
INNER JOIN customers AS C
ON H.CustomerRefID = C.CustomerRefID
WHERE (D.MixedValue > 1000)
Run Code Online (Sandbox Code Playgroud)
但我有点困惑,你能不能给我一个演练?
提前致谢
在我的Android项目中,ORMLite充当缓存.我正在从Web服务器下载数据并将其放入数据库中.我正在调用createOrUpdate
我的对象,但重复数据库出现在数据库中.除了主键(它只是一个自动递增的整数)之外,数据库条目是相同的.我认为,由于我的第二个对象还没有主键,因此ORMLite认为两者是不同的,即使每个其他字段都相同.
有没有人知道这是不是真的?
我正在开发一个Android应用程序,我对是否应该使用Ormlite与Android内容提供程序一起更新和检索数据感到矛盾.内容提供程序将主要用于通知应用程序其他平台上应用程序中发生的数据更改.也许我让它变得比它需要的更复杂.一些更有经验的意见将不胜感激!
以下问题的注释:Android Studio运行ORMLite配置生成配置
我能够让我的配置运行这一个类,但它仍然失败了
Could not find raw directory
Run Code Online (Sandbox Code Playgroud)
这是我的来源
package com.ilopez.android.machinesounds;
import com.j256.ormlite.android.apptools.OrmLiteConfigUtil;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
/**
* Created by User on 7/25/13.
*/
public class DatabaseConfigUtil extends OrmLiteConfigUtil {
private static final Class<?>[] classes = new Class[]{
RecordedSound.class,
};
public static void main(String[] args) throws IOException, SQLException {
writeConfigFile(new File("G:\\MachineSoundsProject\\MachineSounds\\src\\main\\res\\raw\\ormlite_config.txt"), classes );
}
}
Run Code Online (Sandbox Code Playgroud)
我的平台是Windows,我无法弄清楚为什么它一直失败"无法找到原始目录".
这是我的android工作室运行的命令:
"C:\Program Files\Java\jdk1.6.0_37\bin\java" -Didea.launcher.port=7544 "-Didea.launcher.bin.path=C:\Program Files (x86)\Android\android-studio\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files (x86)\Android\android-studio\sdk\platforms\android-17\android.jar;C:\Program Files (x86)\Android\android-studio\sdk\platforms\android-17\data\res;C:\Program Files (x86)\Android\android-studio\sdk\tools\support\annotations.jar;C:\local\Dropbox\git\MachineSoundsProject\MachineSounds\build\classes\debug;C:\Program Files (x86)\Android\android-studio\sdk\extras\android\m2repository\com\android\support\support-v4\13.0.0\support-v4-13.0.0.jar;C:\local\Dropbox\git\MachineSoundsProject\MachineSounds\libs\ormlite-android-4.45.jar;C:\local\Dropbox\git\MachineSoundsProject\MachineSounds\libs\ormlite-core-4.45.jar;C:\local\Dropbox\git\MachineSoundsProject\MachineSounds\libs\ormlite-jdbc-4.45.jar;C:\Program Files (x86)\Android\android-studio\lib\idea_rt.jar" …
Run Code Online (Sandbox Code Playgroud) 我在android项目中使用ORMLite,我不想使用扩展活动,因为我在AsyncTask上将值插入数据库.
在文档中它说:
"如果你不希望延长OrmLiteBaseActivity
与其他基类,那么你将需要复制它们的功能.你需要调用OpenHelperManager.getHelper(Context context, Class openHelperClass)
你的代码的开始,保存帮手,当你想使用它了,然后调用OpenHelperManager.release()
时你完成了它."
它还说要添加数据库助手类strings.xml
,我有.所以我不确定我做错了什么.
我正在使用一个名为DataAccess
我的数据层的类,如下所示:
public class DataAccess {
private Context context;
private DBHelper dbHelper;
public DataAccess(Context _context) {
this.context = _context;
dbHelper = getDBHelper(_context);
}
private DBHelper getDBHelper(Context context) {
if (dbHelper == null) {
dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);
}
return dbHelper;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用扩展的助手类:
public class DBHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "database.db";
private static final int DATABASE_VERSION …
Run Code Online (Sandbox Code Playgroud) 我有这个抽象类:
DomainItem
abstract public class DomainItem {
@DatabaseField(generatedId = true)
protected long id;
@ForeignCollectionField(eager = false)
protected ForeignCollection<ContentItem> contentItens;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
ContentItem:
abstract public class ContentItem {
@DatabaseField(generatedId = true)
protected long id;
@DatabaseField(foreign = true)
protected DomainItem domainItem;
@DatabaseField()
protected String content;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
这些(没有摘要):
@DatabaseTable()
public class PhytoterapicItem extends DomainItem{
public PhytoterapicItem(){
}
}
Run Code Online (Sandbox Code Playgroud)
PhytoterapicContent
@DatabaseTable(tableName = "phytoterapiccontent")
public class PhytoterapicContent extends ContentItem {
@DatabaseField(canBeNull = false)
private String defaultName;
@DatabaseField(canBeNull = false)
private …
Run Code Online (Sandbox Code Playgroud) 我正在修改我的Android应用程序以使用ORMLite,它目前使用了许多CursorAdapter,我非常希望尽量减少编码.
我不是100%肯定但是看起来当ORMLite在db中创建一个id字段时,它总是使用id
,而CursorAdapter需要_id
.
可以使用如下查询来解决此问题:
select id as _id ......
Run Code Online (Sandbox Code Playgroud)
但该Dao.queryRaw()
方法返回一个列表,而不是Cursor,所以我这样做的方法是打开另一个SQLiteOpenHelper数据库连接并使用rawQuery()
.
这有效,但有没有更好的方法呢?拥有两个独立的数据库连接似乎有点过头了,以后可能会存在麻烦.
我喜欢这样的查询:
select data from table
where (x > 1 and x < 100)
or (x > 250 and x < 300)
Run Code Online (Sandbox Code Playgroud)
在ORMlite中,可以使用此代码:
final QueryBuilder<Data,Integer> qb = queryBuilder();
final Where<Data, Integer> w = qb.where();
w.or(
w.gt("x", 1).and().lt("x", 100),
w.gt("x", 250).and().lt("x", 300)
)
Run Code Online (Sandbox Code Playgroud)
虽然如果事先知道条件并且在编码时这很好,我需要动态添加条件.
基本上这种方法public com.j256.ormlite.stmt.Where<T,ID> or(com.j256.ormlite.stmt.Where<T,ID> left, com.j256.ormlite.stmt.Where<T,ID> right, com.j256.ormlite.stmt.Where<T,ID>... others)
还不够.它需要其他or
支持的方法ArrayList
的Where
条件.
谢谢你的任何建议.
我有一个使用ORMLite的应用程序.我需要创建一个函数来重置整个数据库(基本上我需要删除每个数据库中的所有行,重置自动增量和重置索引).
我可能可以通过在每个表上启动截断来实现这一点,但ORMLite是否有一些特定的方法来执行此操作?