GVKun编程网logo

在android中的Sqlite数据库更新命令中无法更新多行

17

在本文中,您将会了解到关于在android中的Sqlite数据库更新命令中无法更新多行的新资讯,并给出一些关于android–Sqlite数据库更新触发服务通过内容观察器进行更新、android–外部

在本文中,您将会了解到关于在android中的Sqlite数据库更新命令中无法更新多行的新资讯,并给出一些关于android – Sqlite数据库更新触发服务通过内容观察器进行更新、android – 外部Micro Sdcard中的SQLite数据库、android – 更新sqlite数据库版本?、android 更新sqlite数据库的实用技巧。

本文目录一览:

在android中的Sqlite数据库更新命令中无法更新多行

在android中的Sqlite数据库更新命令中无法更新多行

我在这里面临一个问题.我试图批量更新我的表,即尝试更新数据库中的多个行.更新很简单.我只需要将列值设置为1,它实际上在应用程序中用作标志.所以我想将值设置为1,在where子句中,我给出了我想要设置的所有id的字符串数组.
但问题是它给了我一个“ 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数据库更新触发服务通过内容观察器进行更新

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数据库

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数据库版本?

android – 更新sqlite数据库版本?

我有一个数据库,我想添加一个列,我更改了静态数据库版本但是当我在我的设备上运行程序时,新列仍然没有,所以我猜我的onUpdate没有被调用,我不确定为什么.

这就是我创建数据库的方式

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,但仍然没有结果

解决方法

为了在Android中升级数据库,您应该将DATABASE_VERSION增加1,以便sqlOpenHelper知道它必须调用onUpgrade方法.

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数据库

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数据库的相关知识,请在本站搜索。

本文标签: