2017-07-24 78 views
1

我在sqlite数据库中工作我有一个产品表,其中包含产品ID,名称,价格,公司我将id作为主键和自动增量当我在数据库中添加产品时productid似乎是空 这里是我的数据库的照片 enter image description here自动增量无法在SQLite数据库中工作

,这里是我的数据库类

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); 
    } 
} 

这是我插入数据库

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); 

      } 
     }); 

    } 
} 

回答

0

使用您的SQL为表创建即

`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是数据库类

这样,副本由于表示的productId第一线具有并且还一个值,第5行示出了porductId,在第二行中,值为,原则上您所拥有的代码应该创建相同。

因此,很可能您已修改代码以更改结构,但尚未意识到onCreate基本上只会在数据库文件的整个生命周期中运行一次,因此,除非删除了数据库文件,否则对结构的更改将会不适用。

可能的解决方案是清除应用程序的数据或卸载应用程序并重新运行。

此外,您很可能不需要使用column_name INTEGER PRIMARY KEY代码AUTOINCREMENT将导致递增列。

我建议你阅读SQLite Autoincrement包括

AUTOINCREMENT关键字强加额外的CPU,内存,磁盘空间,并 磁盘I/O开销,如果不严格需要应该避免。通常不需要 。

+0

不错的解释谢谢 –