我已经构建了一个应用程序,现在我想使用我的新备份应用程序复制正在运行的应用程序的数据库.我通过DB_PATH + DB_NAME使用以下值创建数据库路径:
DB_PATH = "/data/data/iCam.Cam/";
DB_NAME = "testdb.db";
Run Code Online (Sandbox Code Playgroud)
我有代码将数据库从给定路径复制到SD卡.但是,当我最初使用以下方法检查数据库时,它返回false:
public boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
e.fillInStackTrace();
// database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
Run Code Online (Sandbox Code Playgroud)
有关如何实现这一目标的任何建议?
我正在使用SQLiteOpenHelper来编写和读取Android上的SQlite数据库.当用户点击UI时,我使用AsyncTask从SQLite数据库中读取,但在确切的samo时刻,我正在使用其他AsyncTask更新并在后台写入数据库.
每x次我得到数据库锁定异常.我怎样才能解决这个问题?可以同时从多个线程以某种方式访问SQlite吗?
我正在使用它:我有一个从SQLiteOpenHelper扩展的Database类.我实现了onCreate和onUpgrade方法,每次我从数据库读取或写入数据库时我都使用SQLiteDatabase:
SQLiteDatabase database = null;
try {
database = new Database(context).getWritableDatabase();
....
writing and reading from database...
....
} catch (Exception e) {
e.printStackTrace();
} finally {
if (database != null) {
database.close();
}
}
Run Code Online (Sandbox Code Playgroud)
最后,如果我使用它们,我也会关闭SQLiteStatements和Cursors.我应该使用@Justin答案并在Application中使用单例数据库类吗?
这是我得到的错误:
E/SqliteDatabaseCpp(17377): sqlite3_open_v2("/data/data/com.skulptur/databases/LGM.s3db", &handle, 6, NULL) failed
E/SQLiteDatabase(17377): Failed to open the database. closing it.
E/SQLiteDatabase(17377): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
E/SQLiteDatabase(17377): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750)
E/SQLiteDatabase(17377): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) …Run Code Online (Sandbox Code Playgroud) 我在我的两个方法DBDriver类open和close sqlite database如下.
private SQLiteDatabase database;
/**
* Open Database to read and write.
*
* @throws SQLException
*/
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
/**
* Close opened database.
*/
public void close() {
dbHelper.close();
}
Run Code Online (Sandbox Code Playgroud)
我在我的其他课程中使用上述方法来打开和关闭sqlite database.
我想识别数据库是打开还是关闭.我怎么能这样做?
在我的Android应用程序中,我必须将数据插入来自不同线程的几个SQLite表中(一个线程用于插入一个表,并且有5个表).有很多数据所以我在每个线程中使用beginTransaction()- > setTransactionSuccessful()- > endTransaction();并且所有线程同时启动,但在第二个或有时是第三个线程中我总是遇到这个异常:

我使用的是作为单一的SQLite连接(单)这里所说但无论如何这个问题remains.So我事先希望一些help.Thanks!
PS如果我有竞争条件,我应该用什么方式进行多线程插入?
我正在将我的应用程序从Activity更改为Fragments,它很棒,但是我有一个错误,它不会让我打开我的数据库.这是错误(来自logcat):
05-17 15:28:38.704 13025-13025/com.MJV.werktijden E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at com.MJV.werktijden.DBAdapter.open(DBAdapter.java:71)
at com.MJV.werktijden.OverviewFragment.onActivityCreated(OverviewFragment.java:38)
at android.app.Fragment.performActivityCreated(Fragment.java:1703)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
at android.app.BackStackRecord.run(BackStackRecord.java:682)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我试图自己解决,但我找不到问题.只是因为当我将它与Activity一起使用时,这个数据库确实有效.我用这种方法打开数据库:
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
Run Code Online (Sandbox Code Playgroud)
从我的片段中调用该方法:
private final DBAdapter db = new DBAdapter(getActivity());
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Ormlite构建以下查询:
SELECT Column1,
COUNT(Column2),SUM(Column2)
FROM Table
WHERE Column3 = 1
GROUP BY Column1;
Run Code Online (Sandbox Code Playgroud)
我为此使用QueryBuilder,但是我不知道要得到总和,因此仍然只有一个完整的列表。
此结果列表将是哪种类型?我不能将其设为List,因为sum和count不是表中的列。

Fragment秒:My1stFragment和My2ndFragment. My1stFragment我有一个ListView由数据库填充的内部.此外,当我点击编辑按钮时,我调用第二个Fragment来编辑数据.Fragment我编辑我的工资金额并通过点击提交按钮更新我的数据库并返回My1stFragment.My1stFragment,我ListView也没有更新.android android-listview android-fragments android-viewpager android-sqlite
CSV数据库与Android中的SQLite数据库相比如何?
查看StackOverflow上的其他问题,并阅读Android Developer Documentation,我看到SQLite数据库的使用频率远高于从CSV文件中读取数据.还有一些问题,用户希望将CSV文件导入SQLite数据库(例如,此问题或此问题).使用SQLite而不是CSV有优势吗?
我尝试过使用CSV和SQLite一点点,在性能方面我没有看到很大的区别,但如果我在这里错了,请纠正我.
据我所知,有不同的读取CSV文件的方法,我打开并使用BufferedReader类似的方式读取它:
BufferedReader reader =
new BufferedReader(new InputStreamReader(context.getAssets().open(fileName)));
Run Code Online (Sandbox Code Playgroud)
SQLite数据库以通常的方式打开:
SQLiteDatabase db = helper.getReadableDatabase();
Run Code Online (Sandbox Code Playgroud)
我不太确定功能上的差异,虽然我假设SQLite更容易管理和过滤,这就是我问这个问题的原因.
总结一下:
SQLiteDatabase类?为了澄清,我知道CSV文件只是一个用逗号分隔值的文件,即不是作为SQL数据库的"数据库".但是,我仍然可以将CSV文件用作一种数据库,其中逗号分隔值表示不同的列,也可以通过检查特定列是否与特定值匹配来过滤.所以我问哪个更好从中读取数据.
我有两个表,假设历史记录和收藏夹
Favorites 模式是(id int主键,isFav int)History 模式是(id int)Favorites 表具有=>带有ID和一个int(0或1)的歌曲,历史表具有=>系列ID(可能重复)
我想要一条SQL语句,用于从具有值= 1的收藏夹中选择ID,并按历史记录表中的出现次数(计数)进行排序(它可能包含或不记录该ID)
这是一个示例POJO
public class Product{
private long id;
private String name;
private double price;
... constructor for all fields
... getters and setters
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的productDAO中,如果我有这样的查询
@Query(select id, name from products)
LiveData<List<Product>> getProducts()
Run Code Online (Sandbox Code Playgroud)
我收到如下错误:
查询返回的列在... Product中没有字段[price],即使它们被注释为非null或原始类型。查询返回的列:[id,name]
a)如果我进入我的产品并设置
@Nullable
private double price;
Run Code Online (Sandbox Code Playgroud)
错误仍然存在。
b)如果我进入我的产品并设置
@Ignore
private double price;
Run Code Online (Sandbox Code Playgroud)
错误消失了,但是如果我有另一个查询
@Query(select p.id, p.name, p.price, t.someField from products p inner join table t)
LiveData<List<Product>> getJoinQueryResponse()
Run Code Online (Sandbox Code Playgroud)
因为@Ignore已设置,价格返回为0.0。
那么如何解决呢?希望我不需要为房间的每个不同响应都做一个POJO ...
android android-sqlite android-room android-architecture-components
android-sqlite ×10
android ×9
sql ×2
sqlite ×2
android-architecture-components ×1
android-room ×1
csv ×1
database ×1
java ×1
ormlite ×1