在本文中,您将会了解到关于在android中的Sqlite数据库更新命令中无法更新多行的新资讯,并给出一些关于android–Sqlite数据库更新触发服务通过内容观察器进行更新、android–外部
在本文中,您将会了解到关于在android中的Sqlite数据库更新命令中无法更新多行的新资讯,并给出一些关于android – Sqlite数据库更新触发服务通过内容观察器进行更新、android – 外部Micro Sdcard中的SQLite数据库、android – 更新sqlite数据库版本?、android 更新sqlite数据库的实用技巧。
本文目录一览:- 在android中的Sqlite数据库更新命令中无法更新多行
- android – Sqlite数据库更新触发服务通过内容观察器进行更新
- android – 外部Micro Sdcard中的SQLite数据库
- android – 更新sqlite数据库版本?
- android 更新sqlite数据库
在android中的Sqlite数据库更新命令中无法更新多行
但问题是它给了我一个“ android.database.sqlite.sqliteException:绑定或列索引超出范围:”.但是,当以字符串或字符串数组提供单个值时,更新可以正常工作.
这是查询
db.update( tableName,cv,Z_ID + "=?",items );
其中items的类型为String []
请告诉我,我错过了什么?
问候
法赫德·阿里·谢赫
解决方法
如果我们看一下方法调用签名:
update(String table,ContentValues values,String whereClause,String[] whereArgs)
所以:
ContentValues cv=new ContentValues(); cv.put(colName,new Integer(1)); String[] items = new String []{String.valueOf(Z_ID)} db.update( tableName,items );
你的代码看起来像这样吗?
您的items数组必须与where子句匹配.一个不同的例子看起来像这样:
ContentValues cv=new ContentValues(); cv.put(salesColName,new Integer(4534)); String whereClause = "band=? and album=?"; String whereArgs = new String [] { "U2","Joshua Tree" }; db.update( tableName,whereClause,whereArgs);
android – Sqlite数据库更新触发服务通过内容观察器进行更新
我正在尝试使用内容观察器在我的应用程序中的sqlite数据库发生任何更改时更新服务.
我很困惑该怎么做,所以我把下面的代码放在一起.通常,内容观察者与联系人或媒体播放器一起使用后台服务.在我的研究中,我读到它可以与手机上的sqlite数据库一起使用.
问题:
1.由于sqlite数据库没有uri,我将用什么信息替换People.CONTENT_URI
this.getContentResolver().registerContentObserver (People.CONTENT_URI,true,contentObserver);
2.在我的研究中,我没有发现任何会进入数据库类的代码会提醒ContentObserver. Content Observer的所有代码都在服务类中工作吗?
请注意,此问题类似于Android SQLite DB notifications和
how to listen for changes in Contact Database
这两个问题都没有明确回答我的问题.如果您有解释此问题的代码,那将非常有帮助.
这是我下面的半pusedo代码.这是行不通的.我正在使用它来了解如何在数据库信息更改时更新服务.
package com.example.com.test.content.observer;
import java.sql.Date;
import java.util.Calendar;
import java.util.List;
import com.google.android.gcm.demo.app.Alerts.AlarmsService;
import com.google.android.gcm.demo.app.Alerts.Alerts;
import com.google.android.gcm.demo.app.sqllite.Databasesqlite;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Contacts.People;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.database.ContentObserver;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
public class AlarmService extends Service
{
Handler mHandler = new Handler();
Databasesqlite db = new Databasesqlite(this);
List
最佳答案
一般来说,处理这个问题有两个部分:正如您所指出的那样,您需要注册以接收更改的ContentObserver,以及必须通知注册观察者任何更改的SQLiteDatabase.如果这是您拥有的数据库,则可以创建可用于侦听的URI.
(1)首先定义URI,通常在数据库定义文件中.
public static final Uri CONTENT_URI = Uri.parse("mycontent://packagename/something");
(2)为您的数据库Content Provider:
每个db函数(插入,更新,删除)都应在完成操作后调用notifyChange(),以通知观察者发生了更改.
rowId = db.insert(tableName,null,cv);
...
getContext().getContentResolver().notifyChange(newUri,null);
(3)在服务中创建并注册ContentObserver,如same link you provided above所述(记得覆盖deliverSelfNotifications()以返回true)
public class MyService extends Service {
private MyContentObserver mObserver;
@Override
public void onStartCommand(Intent intent,int startId) {
...
mObserver = new MyContentObserver();
getContentResolver().registerContentObserver(Dbfile.CONTENT_URI,mObserver);
}
@Override
public void onDestroy() {
...
if (mObserver != null) {
getContentResolver().unregisterContentObserver(mObserver);
mObserver = null;
}
}
// define MyContentObserver here
}
(4)在您的ContentObserver.onChange()中,您可以向服务发布内容或尽可能处理更改.
此外,如果它有助于您的原因,您可以自定义URI定义以处理您正在观察的不同类型的数据,为每个URI注册观察者,然后重写ContentObserver.onChange(boolean,Uri).
希望这可以帮助!
android – 外部Micro Sdcard中的SQLite数据库
我想知道.
我的标签中有一张外部微型SD卡.
我想在Micro SD卡中创建一个sqlite数据库.
public static final String DATABASE_FILE_PATH = "/extSdCard";
我正在给我的外部微型SD卡路径,但错误显示.
Unable to open Database
是否可以在外部存储卡中创建数据库?
更新: –
public static final String DATABASE_FILE_PATH = "/extSdCard";
public static final String DATABASE_NAME = "mytest";
public SDcardDatabase(final Context context) {
super(context,DATABASE_FILE_PATH + DATABASE_NAME, null, 1);
}
解决方法:
我们可以通过这个给定的路径在外部SD卡中创建数据库.
"/mnt/externalSDcard/dbname"
详情请查看: –
SQLite Database in Samsung Tab2 (External Micro sd card)
https://android.stackexchange.com/questions/33182/why-is-the-sd-card-mounted-to-sdcard-external-sd-instead-of-sdcard-or-m
android – 更新sqlite数据库版本?
这就是我创建数据库的方式
private static class DatabaseHelper extends sqliteOpenHelper { DatabaseHelper(Context context) { super(context,DATABASE_NAME,null,DATABASE_VERSION); } @Override public void onCreate(sqliteDatabase db) { createTables(db); } @Override public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { Log.w("CalendarDB","Upgrading database from version " + oldVersion + " to " + newVersion + ",which will destroy all old data"); db.execsql("DROP TABLE IF EXISTS Events_Table"); onCreate(db); } private void createTables(sqliteDatabase db){ db.execsql("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement," + EVENT + " TEXT," + LOCATION + " TEXT," + DESCRIPTION + " TEXT," + DATE + " TEXT," + START + " LONG," + END + " TEXT," + REAL_START_TIME + " TEXT," + REAL_END_TIME + " TEXT," + COLOR + " TEXT," + BLINK + " TEXT," + VIBRATE + " TEXT," + RING_TONE_PATH + " TEXT," + ICON + " TEXT," + REMINDERS + " TEXT," + START_WITH_REMINDER + " TEXT," + CALENDAR_ID + " TEXT," + EVENT_ID + " TEXT);"); } }
还有什么我需要做的才能让onUpdate被调用吗?我试过跟随this answer,但仍然没有结果
解决方法
Rembember
这仅在您调用getWritableDatabase()时有效,否则将无法升级.如果更改版本并调用getReadableDatabase,它将显示异常
throw new sqliteException("Can't upgrade read-only database from version " + db.getVersion() + " to " + mNewVersion + ": " + path);
但为什么?
你看到当你拨打getWritableDatabase代码检查时,版本是相同的:
if (version != mNewVersion) { db.beginTransaction(); try { if (version == 0) { onCreate(db); } else { if (version > mNewVersion) { onDowngrade(db,version,mNewVersion); } else { onUpgrade(db,mNewVersion); } } db.setVersion(mNewVersion); db.setTransactionSuccessful(); } finally { db.endTransaction(); } }
更新
事实证明它应该与getReadableDatabase()一起使用,因为在代码中你总是得到一个WrittableDatabase.所以它应该适用于这两种方法,这里是getReadableDatabase()的文档:
Create and/or open a database. This will be the same object returned by getWritableDatabase() unless some problem,such as a full disk,requires the database to be opened read-only. In that case,a read-only database object will be returned. If the problem is fixed,a future call to getWritableDatabase() may succeed,in which case the read-only database object will be closed and the read/write object will be returned in the future.
android 更新sqlite数据库
以下是个人见解,如果问题,请指出,多谢
代码如下:
注意,1.把newversion改变,大于oldVersion,比如刚开始时是1,现在设置为2
2.和表对应的那个java文件要相应做改变,比如增加一列,java文件要有对应的set和get方法
3.在方法onUpgrade中对表进行改变,如:增加一列,并给个默认值
4.创建表的sql语句也得添加上那个字段
重新安装程序就会更新数据库
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("info",oldVersion+"===================>"+newVersion);
try {
db.execSQL("alter table ContactModel add column height integer default 8");
} catch (Exception e) {
Log.i("info","异常===================>"+e.getMessage());
}
}
今天关于在android中的Sqlite数据库更新命令中无法更新多行的讲解已经结束,谢谢您的阅读,如果想了解更多关于android – Sqlite数据库更新触发服务通过内容观察器进行更新、android – 外部Micro Sdcard中的SQLite数据库、android – 更新sqlite数据库版本?、android 更新sqlite数据库的相关知识,请在本站搜索。
本文标签: