自动增量在 SQLite 数据库中不起作用
Auto increment is not working in SQLite database
我在 sqlite 数据库中工作。我有一个产品 table,它有一个产品 ID、名称、价格和一个公司 ID,当我将产品添加到数据库时,我将其作为主键和自动增量,但 productid 似乎是空的
这是我的数据库的屏幕截图
这是我的数据库class
package com.example.abdelmagied.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by AbdELMagied on 7/24/2017.
*/
public class database extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "product.db";
private static final String TABLE_NAME = "myproduct";
/// columns in the database
private static final String COL1_NAME = "productId";
private static final String COL2_NAME = "productSalary";
private static final String COL3_NAME = "companyname";
private static final String COL4_NAME = "productName";
// constructor
public database(Context context) {
super(context, DATABASE_NAME , null , 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table myproduct ("+COL1_NAME+" integer primary key autoincrement, "+COL2_NAME+" text , "+COL3_NAME+" text , "+COL4_NAME+" text)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop database " + DATABASE_NAME );
onCreate(sqLiteDatabase);
}
}
这是我插入数据库的activity
package com.example.abdelmagied.myapplication;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class addproduct extends AppCompatActivity {
public Button AddToDatabase;
public EditText productName , productSalary , companyMade;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_addproduct);
// get the button id
AddToDatabase = (Button) findViewById(R.id.AddDatabase);
// handle the action of the click
AddToDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// get the entered info from the edittexts
productName = (EditText) findViewById(R.id.PNameId);
productSalary =(EditText) findViewById(R.id.PSalaryId);
companyMade = (EditText) findViewById(R.id.PSalaryId);
//add to database productName , productSalary , companyMade...
database mydata = new database(getApplicationContext());
SQLiteDatabase db = mydata.getWritableDatabase();
ContentValues content = new ContentValues();
content.put("productSalary" , productSalary.getText().toString());
content.put("companyname" , companyMade.getText().toString());
content.put("productName" , productName.getText().toString());
db.insert("myproduct" , null , content);
}
});
}
}
使用您的 SQL 创建 table 即
`sqLiteDatabase.execSQL("create table myproduct ("+COL1_NAME+" integer primary key autoincrement, "+COL2_NAME+" text , "+COL3_NAME+" text , "+COL4_NAME+" text)");`
然后使用下面的测试:-
dbhlp = new SO45290855(this);
SQLiteDatabase dbx = dbhlp.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(SO45290855.COL2_NAME,"xxxx");
cv.put(SO45290855.COL3_NAME,"yyyy");
cv.put(SO45290855.COL4_NAME,"zzzz");
dbx.insert(SO45290855.TABLE_NAME,null,cv);
ContentValues cv2 = new ContentValues();
cv2.put(SO45290855.COL2_NAME,"xxxx");
cv2.put(SO45290855.COL3_NAME,"yyyy");
cv2.put(SO45290855.COL4_NAME,"zzzz");
dbx.insert(SO45290855.TABLE_NAME,null,cv);
Cursor csr = dbx.query(SO45290855.TABLE_NAME,null,null,null,null,null,null);
while (csr.moveToNext()) {
for (int i=0; i < csr.getColumnCount();i++) {
Log.d("CsrPos_" + Integer.toString(csr.getPosition()),
"Column=" + csr.getColumnName(i) +
" Data=" + csr.getString(i)
);
}
}
给出的输出是:-
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productId Data=1
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productSalary Data=xxxx
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=companyname Data=yyyy
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productName Data=zzzz
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productId Data=2
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productSalary Data=xxxx
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=companyname Data=yyyy
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productName Data=zzzz
SO45290855 是您数据库的副本 class
因此,由于第一行显示 productId 的值为 1 并且第 5 行显示 porductId,在第二行,值为2,原则上你的代码应该创建相同的。
因此很可能您修改了代码以更改结构但没有意识到 onCreate
基本上在数据库文件的生命周期内运行一次,因此除非您删除了数据库文件,不会应用对结构的更改。
可能的解决方法是清除应用程序的数据或卸载应用程序并重新运行。
除此之外,您很可能不需要使用 column_name INTEGER PRIMARY KEY
编写 AUTOINCREMENT 代码,这将导致列递增。
我建议阅读 SQLite Autoincrement ,其中包括
The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and
disk I/O overhead and should be avoided if not strictly needed. It is
usually not needed.
我在 sqlite 数据库中工作。我有一个产品 table,它有一个产品 ID、名称、价格和一个公司 ID,当我将产品添加到数据库时,我将其作为主键和自动增量,但 productid 似乎是空的
这是我的数据库的屏幕截图
这是我的数据库class
package com.example.abdelmagied.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by AbdELMagied on 7/24/2017.
*/
public class database extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "product.db";
private static final String TABLE_NAME = "myproduct";
/// columns in the database
private static final String COL1_NAME = "productId";
private static final String COL2_NAME = "productSalary";
private static final String COL3_NAME = "companyname";
private static final String COL4_NAME = "productName";
// constructor
public database(Context context) {
super(context, DATABASE_NAME , null , 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table myproduct ("+COL1_NAME+" integer primary key autoincrement, "+COL2_NAME+" text , "+COL3_NAME+" text , "+COL4_NAME+" text)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop database " + DATABASE_NAME );
onCreate(sqLiteDatabase);
}
}
这是我插入数据库的activity
package com.example.abdelmagied.myapplication;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class addproduct extends AppCompatActivity {
public Button AddToDatabase;
public EditText productName , productSalary , companyMade;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_addproduct);
// get the button id
AddToDatabase = (Button) findViewById(R.id.AddDatabase);
// handle the action of the click
AddToDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// get the entered info from the edittexts
productName = (EditText) findViewById(R.id.PNameId);
productSalary =(EditText) findViewById(R.id.PSalaryId);
companyMade = (EditText) findViewById(R.id.PSalaryId);
//add to database productName , productSalary , companyMade...
database mydata = new database(getApplicationContext());
SQLiteDatabase db = mydata.getWritableDatabase();
ContentValues content = new ContentValues();
content.put("productSalary" , productSalary.getText().toString());
content.put("companyname" , companyMade.getText().toString());
content.put("productName" , productName.getText().toString());
db.insert("myproduct" , null , content);
}
});
}
}
使用您的 SQL 创建 table 即
`sqLiteDatabase.execSQL("create table myproduct ("+COL1_NAME+" integer primary key autoincrement, "+COL2_NAME+" text , "+COL3_NAME+" text , "+COL4_NAME+" text)");`
然后使用下面的测试:-
dbhlp = new SO45290855(this);
SQLiteDatabase dbx = dbhlp.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(SO45290855.COL2_NAME,"xxxx");
cv.put(SO45290855.COL3_NAME,"yyyy");
cv.put(SO45290855.COL4_NAME,"zzzz");
dbx.insert(SO45290855.TABLE_NAME,null,cv);
ContentValues cv2 = new ContentValues();
cv2.put(SO45290855.COL2_NAME,"xxxx");
cv2.put(SO45290855.COL3_NAME,"yyyy");
cv2.put(SO45290855.COL4_NAME,"zzzz");
dbx.insert(SO45290855.TABLE_NAME,null,cv);
Cursor csr = dbx.query(SO45290855.TABLE_NAME,null,null,null,null,null,null);
while (csr.moveToNext()) {
for (int i=0; i < csr.getColumnCount();i++) {
Log.d("CsrPos_" + Integer.toString(csr.getPosition()),
"Column=" + csr.getColumnName(i) +
" Data=" + csr.getString(i)
);
}
}
给出的输出是:-
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productId Data=1
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productSalary Data=xxxx
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=companyname Data=yyyy
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productName Data=zzzz
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productId Data=2
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productSalary Data=xxxx
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=companyname Data=yyyy
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productName Data=zzzz
SO45290855 是您数据库的副本 class
因此,由于第一行显示 productId 的值为 1 并且第 5 行显示 porductId,在第二行,值为2,原则上你的代码应该创建相同的。
因此很可能您修改了代码以更改结构但没有意识到 onCreate
基本上在数据库文件的生命周期内运行一次,因此除非您删除了数据库文件,不会应用对结构的更改。
可能的解决方法是清除应用程序的数据或卸载应用程序并重新运行。
除此之外,您很可能不需要使用 column_name INTEGER PRIMARY KEY
编写 AUTOINCREMENT 代码,这将导致列递增。
我建议阅读 SQLite Autoincrement ,其中包括
The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed.