的炉石什么时候改动需要改动此数值吗

jqGrid在执行修改操作时,主键不进行编辑但editurl需返回该值。_百度知道
jqGrid在执行修改操作时,主键不进行编辑但editurl需返回该值。
使用jqGrid自带的修改edit。主键列是隐藏,不进行编辑(editable: false),并且后台生成的,但在修改时需要把该主键返回到接受修改的页面editurl。这个列该怎么设置属性?
我有更好的答案
请问怎么处理啊,我也遇到这个问题,不知怎么办。。。
colModel:[
{index:0, name:&uid&,
width:60, key:true},
....]关键是uid 加了 key:true这样在回传参数给后台页面时uid的值就会被放到名为 id 的参数中。所以, 要求 key:true 对应的数据,必须是数字
没看懂“这个列该怎么设置属性”的意思。如果你用的是自带的edit功能那么是可以自动将id值传给后台的。你的主键列如果不是jqgird自动生成的类似1,2,3,4,5等等这样自动生成的数字的话,在prNames里把id这个属性改成你的隐藏列的name(或者index我记不太清了,我用的时候name和index赋值总是一样的)值就可以了。有疑问可以继续补充提问。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。修改数据库的时候
直接传的值跟Date toString一样 该怎么修改正常执行
[问题点数:40分,结帖人CYSESP]
修改数据库的时候
直接传的值跟Date toString一样 该怎么修改正常执行
[问题点数:40分,结帖人CYSESP]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|新版WDCP的时候应该怎样修改数据库上传大小限制
WDCP最新版面板默认设置最大是2MB的导入限制,而数据库压缩包在5M多,想必在使用新版的时候应该怎样修改数据库上传大小限制呢?其实非常的简单,只需要简单的修改一些就可以了,完全是在wdcp面板管理后台进行修改,目前小七就是按照以下的设置方法已经成功导入了!
php.ini系统设置MYSQL大小参数修改
将 post_max_size&默认的20MB修改成我们上面的大小一致,比如我也改成80M
将 upload_max_filesize&默认的2M改成你需要的大小,比如我可以改成80M
将 max_execution_time&后面的参数修改成0(默认是30)
以上的设置完全根据自己数据库包的大小进行设置,设置好之后点击确定,然后重启WEB之后我们在PHPMYADMIN面板中的导入数据库中就可以看到原先的2MB变成80MB。
一定要记住,设置好之后点击确定,一定要点击后面的重启WEB,不然设置的不会生效哦!这是小七个人比较喜欢采用的一种方法,适合数据库不大的时候使用的!
本文摘自&http://www.7vps.net/5889.html&
版权申明:本站文章部分自网络,如有侵权,请联系QQ ,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。
------分隔线----------------------------
自v3.2开始, wdcp 支持多PHP版本共存共用和切换,可根据需求灵活选择和使用 从v3.0/3...
WDCP的计划任务中添加自动重启WEB服务实现自动释放内存。 1、在SSH中添加执行下面的代...
我们经常用美国vps 或者 日本vps 搭建php环境因为wdcp默认环境下没有安装mod_speling....
第一、WDCP升级PHP5.6.9 默认WDCP安装后我们看到的PHP版本是PHP5.2.17,这个版本已经...
[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 这个是nginx重...
方法/步骤 安装好wdcp面板,通过8080端口(http://ip:8080)登录后,是没有站点信息的...在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
数据库在添加新功能的时候,如果需要改动数据库字段一般如何迁移数据
来源: MongoDB 技术问答
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
是改动表中的字段吧,你查一下ALTER TABLE这个语法,用SQL指令修改。
另一种方法就是新建一个表,将老数据导入新表,然后删除老表,将新表改名
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。32047人阅读
Android(184)
问题:Android数据库更新并保留原来的数据如何实现Andoird的SQLiteOpenHelper类中有一个onUpgrade方法。帮助文档中只是说当数据库升级时该方法被触发。经过实践,解决了我一连串的疑问:1. 帮助文档里说的“数据库升级”是指什么?你开发了一个应用,当前是1.0版本。该程序用到了数据库。到1.1版本时,你在数据库的某个表中增加了一个字段。那么软件1.0版本用的数据库在软件1.1版本就要被升级了(当然这里的升级包括两个概念,一个是应用升级还有就是数据库升级)关于应用升级我们知道直接在AndroidManifest.xml文件中修改即可。关于数据库升级我们就需要在代码中修改:private static final String DBNAME = "ads.db";
private static final int VERSION = 1;
public DBOpenHelper(Context context) {
super(context, DBNAME, null, VERSION);
}我们在使用数据库的时候,都会自定义一个Helper类,需要实现SQLiteOpenHelper类(是个抽象类),然后实现他的onCreate和onUpgrade方法。上面的一段代码片段就是我们自定义的Helper类中的,这里我们会看到在构造方法中,我们会调用父类(就是SQLiteOpenHelper类的构造方法),这里需要传递Context变量、数据库名称、以及数据库的版本号(第三个参数是一个工厂类,可以传递null)。所以我们就可以在这个地方进行数据库的升级了,当然我们一般第一次把数据库的版本号设置成1,以后递增即可,这个的原因,后面在分析源码的时候会提到。2. 数据库升级应该注意什么?软件的1.0版本升级到1.1版本时,数据库中老的数据不能丢。那么在1.1版本的应用中就要有地方能够检测出来新的数据库与老的数据库不兼容。并且能够有办法把1.0应用中的数据库升级到1.1应用时能够使用的数据库。换句话说,要在1.0应用的数据库中的那个表中增加那个字段,并赋予这个字段默认值。3. 应用如何知道数据库需要升级?SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在应用1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。4. 何时触发数据库升级?如何升级?当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。下面就从源码的角度分析一下,执行流程:首先来看一下SQLiteOpenHelper.java类
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
this(context, name, factory, version, null);
}我们看到了,这个构造方法,就是我们在子类中调用的,第三个参数是一个游标工厂类,可以传递null。再看一下他的其他构造方法:
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version,
DatabaseErrorHandler errorHandler) {
if (version & 1) throw new IllegalArgumentException("Version must be &= 1, was " + version);
mContext =
mFactory =
mNewVersion =
mErrorHandler = errorH
}这里我们会看到一个信息,就是会判断版本号,如果版本号小于1的话直接抛异常了,所以我们一般将版本号设置成1。构造结束了,下面来看一下他的onCreate和onUpgrade方法:
public abstract void onCreate(SQLiteDatabase db);
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);这两个方法都是抽象的,需要子类去实现他们。好吧,那下面我们该看哪个方法呢?当然是看我们使用到的方法了。我们一般在使用数据库的时候会用到的代码:DBOpenHelper openHelper = new DBOpenHelper(this);
SQLiteDatabase db = openHelper.getWritableDatabase();初始化自定义的Helper类,然后获取一个数据库对象SQLiteDatabase。那么我们就来看看你getWritableDatabase方法:
public SQLiteDatabase getWritableDatabase() {
synchronized (this) {
return getDatabaseLocked(true);
}这里用到了同步机制了,接着看getDatabaseLocked方法:private SQLiteDatabase getDatabaseLocked(boolean writable) {
if (mDatabase != null) {
if (!mDatabase.isOpen()) {
The user closed the database by calling mDatabase.close().
mDatabase =
} else if (!writable || !mDatabase.isReadOnly()) {
// The database is already open for business.
if (mIsInitializing) {
throw new IllegalStateException("getDatabase called recursively");
SQLiteDatabase db = mD
mIsInitializing =
if (db != null) {
if (writable && db.isReadOnly()) {
db.reopenReadWrite();
} else if (mName == null) {
db = SQLiteDatabase.create(null);
if (DEBUG_STRICT_READONLY && !writable) {
final String path = mContext.getDatabasePath(mName).getPath();
db = SQLiteDatabase.openDatabase(path, mFactory,
SQLiteDatabase.OPEN_READONLY, mErrorHandler);
db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,
mFactory, mErrorHandler);
} catch (SQLiteException ex) {
if (writable) {
Log.e(TAG, "Couldn't open " + mName
+ " for writing (will try read-only):", ex);
final String path = mContext.getDatabasePath(mName).getPath();
db = SQLiteDatabase.openDatabase(path, mFactory,
SQLiteDatabase.OPEN_READONLY, mErrorHandler);
onConfigure(db);
final int version = db.getVersion();
if (version != mNewVersion) {
if (db.isReadOnly()) {
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + mName);
db.beginTransaction();
if (version == 0) {
onCreate(db);
if (version & mNewVersion) {
onDowngrade(db, version, mNewVersion);
onUpgrade(db, version, mNewVersion);
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
onOpen(db);
if (db.isReadOnly()) {
Log.w(TAG, "Opened " + mName + " in read-only mode");
mDatabase =
} finally {
mIsInitializing =
if (db != null && db != mDatabase) {
db.close();
}这个方法的东西就有点多了,貌似也是最核心的部分。首先我们看到一个字段mDatabase,是个SQLiteDatabase类型的private SQLiteDatabase mD下面来看一下开始部分的代码:if (mDatabase != null) {
if (!mDatabase.isOpen()) {
The user closed the database by calling mDatabase.close().
mDatabase =
} else if (!writable || !mDatabase.isReadOnly()) {
// The database is already open for business.
}如果mDatabase不为null的话,然后在判断如果这个数据库是否是关闭的状态,如果关闭了就将其设置null。如果没有关闭,就判断他的状态是可读还是可写的状态,然后返回一个实例即可.继续下面的代码:SQLiteDatabase db = mD
mIsInitializing =
if (db != null) {
if (writable && db.isReadOnly()) {
db.reopenReadWrite();
} else if (mName == null) {
db = SQLiteDatabase.create(null);
if (DEBUG_STRICT_READONLY && !writable) {
final String path = mContext.getDatabasePath(mName).getPath();
db = SQLiteDatabase.openDatabase(path, mFactory,
SQLiteDatabase.OPEN_READONLY, mErrorHandler);
db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,
mFactory, mErrorHandler);
} catch (SQLiteException ex) {
if (writable) {
Log.e(TAG, "Couldn't open " + mName
+ " for writing (will try read-only):", ex);
final String path = mContext.getDatabasePath(mName).getPath();
db = SQLiteDatabase.openDatabase(path, mFactory,
SQLiteDatabase.OPEN_READONLY, mErrorHandler);
}这段代码主要是初始化一个SQLiteDatabase对象。继续:final int version = db.getVersion();
if (version != mNewVersion) {
if (db.isReadOnly()) {
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + mName);
db.beginTransaction();
if (version == 0) {
onCreate(db);
if (version & mNewVersion) {
onDowngrade(db, version, mNewVersion);
onUpgrade(db, version, mNewVersion);
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}这段代码就是我们这次的主要研究对象,也会解决我们的很多疑问。代码的逻辑很简单:首先他获取到当前数据库的版本号,这里的db就是之前代码中创建的一个SQLiteDatabase对象,然后调用它的getVersion方法获取版本号,查看getVersion的源码:
public int getVersion() {
return ((Long) DatabaseUtils.longForQuery(this, "PRAGMA user_", null)).intValue();
}这里看到是一个DatabaseUtils类的longForQuery方法,继续找到这个方法的源码:
public static long longForQuery(SQLiteDatabase db, String query, String[] selectionArgs) {
SQLiteStatement prog = db.compileStatement(query);
return longForQuery(prog, selectionArgs);
} finally {
prog.close();
}找到这个方法了,其实他内部很简单,就是执行一个sql语句,sql语句为:PRAGMA user_这里查询的结果是long类型的,所以我们在定义数据库的版本的时候一般是整数,递增也是整数。那么当我们首次创建数据库的时候他的版本值是多少呢?其实这个可以猜的。可能为0。那么我们就来做个验证吧。这里的验证不是用代码的方式了,而是借助于一个软件:Sqlite Expert这个软件用起来还是比较简单的。我们新建一个数据库,然后执行上面的SQL语句,结果如下图:果然第一次得到的版本号是0,好的下面继续来看一下之前的代码分析,之前分析到了,获取数据库的版本号,然后就是和之前的版本进行比较,如果不相等这里又会做一个判断,判断当前的数据库是否为只读的,如果是只读的话,是不能进行后续的更新操作,抛个异常。if (db.isReadOnly()) {
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + mName);
}如果不是只读的话,继续下面的代码:db.beginTransaction();
if (version == 0) {
onCreate(db);
if (version & mNewVersion) {
onDowngrade(db, version, mNewVersion);
onUpgrade(db, version, mNewVersion);
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}开启一个事务。这里会判断如果获取到的数据库的版本为0,那么就执行onCreate方法,如果版本号有增加就会执行onUpgrade方法,如果版本号有递减的话,就会执行onDowngrade方法,抛异常了。public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
throw new SQLiteException("Can't downgrade database from version " +
oldVersion + " to " + newVersion);
}然后设置数据库的版本为最新的值。结束事务。这里在使用的时候遇到一个问题,就是我在onUpgrade方法中调用了onCreate方法,但是此时onCreate方法会报异常,当然我们将其捕获了(在外面使用Helper的时候捕获的),但是每次打开应用的时候,onUpgrade方法都会执行。当时一直在找原因。没头绪呀。其实这里就可以找到原因,因为当onUpgrade方法报异常(因为在onUpgrade方法中调用了onCreate方法,当onCreate方法报异常时,onUpgrade方法没有捕获到这个异常就还会报异常)之后,后续代码就不执行了,那么下面的设置数据库最新版本号的代码也不会执行了,所以每次打开app的时候,会进行版本号的比对,结果还是会执行onUpgrade方法,这个方法还是会报异常,所以会出现每次打开app的时候onUpgrade方法都会执行一次。下面来看一下package com.sohu.
import android.content.C
import android.database.sqlite.SQLiteD
import android.database.sqlite.SQLiteDatabase.CursorF
import android.database.sqlite.SQLiteOpenH
import android.util.L
import android.widget.T
public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DBNAME = "ads.db";
private static final int VERSION = 1;
public DBOpenHelper(Context context) {
super(context, DBNAME, null, VERSION);
public void onCreate(SQLiteDatabase db) {
Log.i("DEMO","oldVersion,onCreate()");
db.execSQL("CREATE TABLE IF NOT EXISTS offlineBanner("//
+ "id integer primary key autoincrement," //
+ "vid VARCHAR(100),"//
//+ "adsequences integer,"
//+ "isofflineads integer,"
+ "Impression VARCHAR(2000),"//
+ "Duration VARCHAR(50)," //
+ "ClickThrough VARCHAR(500),"//
+ "ClickTracking VARCHAR(500)," //
+ "MediaFile VARCHAR(500)," //
+ "creativeView VARCHAR(500),"//
+ "start VARCHAR(500)," //
+ "firstQuartile VARCHAR(500),"//
+ "midpoint VARCHAR(500)," //
+ "thirdQuartile VARCHAR(500),"//
+ "complete VARCHAR(500)," //
+ "sdkTracking VARCHAR(2000),"//
+ "sdkClick VARCHAR(2000)," //
+ "time VARCHAR(50));");//
//这行代码会报异常
db.execSQL("CREATE TABLE offlinePause("//
+ "id integer primary key autoincrement,"//
+ "vid VARCHAR(100)," //
+ "Impression VARCHAR(2000)," //
+ "StaticResource VARCHAR(500),"//
+ "NonLinearClickThrough VARCHAR(500),"//
+ "sdkTracking VARCHAR(2000)," //
+ "sdkClick VARCHAR(2000)," //
+ "time VARCHAR(50));");//
db.execSQL("CREATE TABLE IF NOT EXISTS download_url ("//
+ "id integer primary key autoincrement,"//
+ "url varchar(500),"//
+ "status integer,"//
+ "length integer)");//
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("DEMO","oldVersion=" + oldVersion + ",newVersion" + newVersion);
if (oldVersion != newVersion) {
db.execSQL("ALTER TABLE offlineBanner ADD COLUMN");
db.execSQL("ALTER TABLE offlineBanner ADD COLUMN");
db.execSQL("DROP TABLE IF EXISTS download_url");
//执行方法会报异常
onCreate(db);
}报异常的原因很简单。当我需要更新的时候,就会执行onUpgrade方法,这里又执行了onCreate方法,在创建pause表的时候会报异常,因为这个表已经存在了。当我们把代码外面加上try...catch的时候:try{
//开始使用数据库
DBOpenHelper openHelper = new DBOpenHelper(this);
SQLiteDatabase db = openHelper.getWritableDatabase();
db.close();
}catch (Exception e){
}问题会解决,但是onUpgrade方法就会执行多次:所以还是要解决一下onCreate方法中的异常问题,那个异常就是因为表存在了,所以建立表的时候需要判断表是否已经存在了。这样就可以了。上面从源码的角度了解了原理,下面来看一下实例:做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了。 SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:ALTER TABLE Subscription ADD COLUMN Activation BLOB;
ALTER TABLE Subscription ADD COLUMN Key BLOB;另外,如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。1. 将表名改为临时表 ALTER TABLE Subscription RENAME TO __temp__S2. 创建新表CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16)
NOT NULL);3. 导入数据  INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__S或者  INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM __temp__S* 注意 双引号”” 是用来补充原来不存在的数据的4. 删除临时表  DROP TABLE __temp__S通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。当然,如果遇到减少字段的情况,也可以通过创建临时表的方式来实现。Android应用程序更新的时候如果数据库修改了字段需要更新数据库,并且保留原来的数据库数据:这是原有的数据库表CREATE_BOOK = "create table book(bookId integer primarykey,bookName text);";然后我们增加一个字段:CREATE_BOOK = "create table book(bookId integer primarykey,bookName text,bookContent text);";首先我们需要把原来的数据库表重命名一下CREATE_TEMP_BOOK = "alter table book rename to _temp_book";然后把备份表中的数据copy到新创建的数据库表中INSERT_DATA = "insert into book select *,' ' from _temp_book";(注意' '是为新加的字段插入默认值的必须加上,否则就会出错)然后我们把备份表干掉就行啦。DROP_BOOK = "drop table _temp_book";然后把数据库的版本后修改一下,再次创建数据库操作对象的时候就会自动更新(注:更新的时候第一个创建的操作数据的对象必须是可写的,也就是通过这个方法getWritableDatabase()获取的数据库操作对象)然后在onUpgrade()方法中执行上述sql语句就OKpublic class DBservice extends SQLiteOpenHelper{
private String CREATE_BOOK = "create table book(bookId integer primarykey,bookName text);";
private String CREATE_TEMP_BOOK = "alter table book rename to _temp_book";
private String INSERT_DATA = "insert into book select *,'' from _temp_book";
private String DROP_BOOK = "drop table _temp_book";
public DBservice(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
db.execSQL(CREATE_TEMP_BOOK);
db.execSQL(CREATE_BOOK);
db.execSQL(INSERT_DATA);
db.execSQL(DROP_BOOK);
}总结:这次遇到的问题,开始的时候不知道怎么解决,那我们就继续去看那个操蛋的代码吧,这里的源代码其实不难的~~,但是我们要养成看源代码的习惯。《Android应用安全防护和逆向分析》点击立即购买:
更多内容:关注公众号,最新技术干货实时推送编码美丽技术圈微信扫一扫进入我的"技术圈"世界扫一扫加小编微信添加时请注明:“编码美丽”非常感谢!
文章:64篇
阅读:1284626
文章:30篇
阅读:509841
文章:27篇
阅读:503006
文章:23篇
阅读:441224
文章:41篇
阅读:803326

我要回帖

更多关于 炉石什么时候改动 的文章

 

随机推荐