我最近得到这个错误我知道原因,但我不知道如何解决它.
这是logcat的错误:
10-05 02:34:00.177: E/SQLiteDatabase(1111): close() was never explicitly called on database '/data/data/standard.internet.marketing.mymovingfriend/databases/mymovingfriend'
10-05 02:34:00.177: E/SQLiteDatabase(1111): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:770)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at standard.internet.marketing.mymovingfriend.SQLHandler.open(SQLHandler.java:178)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at standard.internet.marketing.mymovingfriend.ListMovingNames$1.onClick(ListMovingNames.java:71)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.view.View.performClick(View.java:3511) …Run Code Online (Sandbox Code Playgroud) 我只是尝试使用ActiveAndroid.从下面的教程在这里,我设置的一切.我添加了清单条目:
应用程序android:name ="com.activeandroid.app.Application"...
Run Code Online (Sandbox Code Playgroud)meta-data android:name="AA_DB_NAME" android:value="MyDb.db" meta-data android:name="AA_DB_VERSION" android:value="1"
并创建了我的模型类:
package com.mycomp.Model;
import org.joda.time.LocalDate;
import org.odata4j.core.Guid;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
@Table(name = "Table1")
public class Table1 extends Model
{
@Column(name = "Custom_ID")
public Guid Custom_ID;
@Column(name = "Name")
public String Name;
@Column(name = "Usr_type")
public int Usr_type;
@Column(name = "BDate")
public LocalDate BDate;
public MyEnum UserGroup;
public Table1()
{
super();
}
public Table1(String name, LocalDate date, Guid custom_id,
MyEnum userGroup)
{
super();
Name = name;
BDate …Run Code Online (Sandbox Code Playgroud) 我有一个有3列的表.列是
BaseColumns._ID | NATIVE_CONTACT_ID | HIDDEN_TYPE
Run Code Online (Sandbox Code Playgroud)
在这些,BaseColumns._ID是一个主要的关键.我想要的是,我不想让开发人员插入重复值NATIVE_CONTACT_ID,如果他试图插入,那么HIDDEN_TYPE对应的列值的旧值NATIVE_CONTACT_ID应该用新值覆盖.
让我更多地澄清你.例如,我的表在几次插入后看起来像这样.
_ID | NATIVE_CONTACT_ID | HIDDEN_TYPE
---------------------------------------
1 23 1
2 24 0
3 25 1
4 26 0
Run Code Online (Sandbox Code Playgroud)
现在,当开发人员想要插入NATIVE_CONTACT_ID值为25且具有HIDDEN_TYPE值的新行时0,旧值HIDDEN_TYPE应更改为此新值.这里它应该改为0from 1,我不想允许重复插入NATIVE_CONTACT_ID.
我希望我能清楚地解释我的问题.
现在我的问题是,我需要使用什么关键字和SQL语句来创建这样的表?
这是我试过的......
public static final String TABLE_NAME = "hidden_info";
public static final String HIDDEN_TYPE = "hidden_type";
public static final String NATIVE_CONTACT_ID = "native_contact_id";
public static final String _ID = BaseColumns._ID; …Run Code Online (Sandbox Code Playgroud) 我想在Android中的表中插入一些行,我正在使用它:
INSERT INTO MyTable (Column_1, Column_1) VALUES ('X',100);
Run Code Online (Sandbox Code Playgroud)
查询运行并且不会引发异常,但是当我从中检索所有行时MyTable,不会返回任何行.
我不想使用该insert方法,因为查询是从文件中读取的,我想将它们插入到数据库中.
我的代码出了什么问题?
更新:该rawQuery()方法不运行查询,但execSQL()确实如此.
我正在尝试对我的数据库运行查询以从我的数据库中获取一些数据(这会将页面更改为页面).我在Double balance = db.getSum(); 下面得到一个NullPointerException 是我的fragmentstatepageradapter的完整代码
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
int listSize;
String[] tabNames;
String tabName;
protected Context mContext;
/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm, Context c) {
super(fm);
mContext = c;
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
MainFragment mainFragment = new MainFragment();
final DatabaseHelper db = new DatabaseHelper(mContext); …Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-sqlite fragmentstatepageradapter
我知道这已经被问过几次了,但是在所有这些问题中,OP和回答者都没有提供清晰的例子。
所以我想问的是是否有这样的课程
public class MyDatabaseDB {
// database constants
public static final String DB_NAME = "mydatabase.db";
public static final int DB_VERSION = 1;
// list table constants
public static final String LIST_TABLE = "list";
public static final String LIST_ID = "_id";
public static final int LIST_ID_COL = 0;
public static final String LIST_NAME = "list_name";
public static final int LIST_NAME_COL = 1;
// task table constants
public static final String TASK_TABLE = "task";
public static final String TASK_ID = "_id"; …Run Code Online (Sandbox Code Playgroud) 我有两个数据库Mydb.db和Updatedb.db.它们具有相同的结构并且都具有相同的结构Table1.
我想将所有记录添加Updatedb.db到Table1.
有大约25000条记录需要更新.
我用了:
mDataBase.openDataBaseForWrite();
SQLiteDatabase myInternalDatabase = mDataBase.getDb();
myInternalDatabase.execSQL("ATTACH DATABASE '" + ATTACH_DB_PATH
+ File.separator + ATTACH_DB_NAME + "' AS New_DB");
myInternalDatabase
.execSQL("INSERT INTO ResultMaster SELECT * FROM New_DB.ResultMaster;");
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
09-16 14:44:32.584: E/AndroidRuntime(2766): FATAL EXCEPTION: main
09-16 14:44:32.584: E/AndroidRuntime(2766): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database: /mnt/sdcard/AttachDb/backupname.db (code 14)
09-16 14:44:32.584: E/AndroidRuntime(2766): at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
09-16 14:44:32.584: E/AndroidRuntime(2766): at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:727)
09-16 14:44:32.584: E/AndroidRuntime(2766): at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
09-16 14:44:32.584: E/AndroidRuntime(2766): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
09-16 …Run Code Online (Sandbox Code Playgroud) 这是我的问题.我的应用程序启动了几个线程,每个线程都用于更新特定对象.对象的更新发生在对单个数据库的查询中.有一个数据库和一个OpenHelper.我的应用程序的行为告诉我,对数据库的调用是非同时的,也是我想要的.如何同时从不同的线程访问同一个数据库?如果每个对象的数据都在不同的表中,那么将数据库拆分到多个数据库中会更有效,每个数据库对应一个数据库?
public class SomethingToBeUpdated implements Runnable {
private SQLiteDatabase db;
@Override
public void run() {
db.rawQuery( ... bla bla
}
}
public class MainActivity extends Activity {
private SomethingToBeUpdated[] list = bla bla...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
for( SomethingToBeUpdated x : list ) {
new Thread(x).start();
}
}
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个有数据对象的活动.它根据该对象更新其gui组件.现在让我们说它被暂停(OnPause被调用)但没有停止或破坏
同时,接收到推送通知(启动了intentservice),我需要使用推送通知对象更新该对象,以便在恢复应用程序时更新gui.
我考虑过向活动发送一个广播,以便它可以更新其数据对象但我在某处读到,当活动暂停时,则不会收到广播.
在这种情况下我该怎么办?
android android-contentprovider android-lifecycle android-sqlite
我想SQLite在收到消息时将消息存储到数据库中。我知道我必须用BroadcastReceiver做这个。但是我不知道该怎么做。onReceive()调用时是否可以将传入的短信存储到数据库中?
请帮我。