【问题标题】:no columns in mysqlite databasesqlite 数据库中没有列
【发布时间】:2015-05-30 08:09:46
【问题描述】:

我做了一个 android eclipse 项目,它使用 SQLite 作为数据库。

当我尝试在手机上运行项目时发生一些错误。当我单击查看按钮(查看我的数据库)时,应用程序说: 我的数据库中没有列。

为什么会这样?

数据层:

public class Translator {

public static final String KEY_ROWID ="_id";
public static final String KEY_DESC ="page_desc";

private static final String DATABASE_NAME  ="Translatordb";
private static final String DATABASE_TABLE ="pageTable";
private static final int DATABASE_VERSION  = 1;

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

public static class DbHelper extends SQLiteOpenHelper{
    
    public DbHelper(Context context) {  
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
        KEY_ROWID + " STRING PRIMARY KEY, " +
        KEY_DESC + " TEXT NOT NULL);"
                );
    }


    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }
    
}

 public Translator(Context c){
     ourContext = c;
}

public Translator open() throws SQLException{
    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close(){
    ourHelper.close();
}

public long createEntry(String id, String description){
    ContentValues cv = new ContentValues();
    cv.put(KEY_ROWID,id);
    cv.put(KEY_DESC,description);
    return ourDatabase.insert(DATABASE_TABLE,null, cv);
}

public long createEntry1(String id, String description){
    ContentValues cv = new ContentValues();
    cv.put(KEY_ROWID,"P01");
    cv.put(KEY_DESC,"Snow White");
    return ourDatabase.insert(DATABASE_TABLE,null, cv);
}


public String getData() {
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID,KEY_DESC};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns,null,null,null,null,null);
    String result =" ";
    
    int iRow = c.getColumnIndex(KEY_ROWID);
    int iDescription = c.getColumnIndex(KEY_DESC);
    
 for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
    result =result + c.getString(iRow)+ "  " +c.getString(iDescription) +"  \n";
    }

    return result;
    
}   

主Activity.java

public class MainActivity extends Activity implements OnClickListener {


static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
Button view;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    view =(Button) findViewById(R.id.viewSQL);
    view.setOnClickListener(this);
    
}



  //product qr code mode
public void scanQR(View v) {
    try {
        //start the scanning activity from the com.google.zxing.client.android.SCAN intent
        Intent intent = new Intent(ACTION_SCAN);
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, 0);
        
        
    } catch (ActivityNotFoundException anfe) {
        //on catch, show the download dialog
        showDialog(MainActivity.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
    }
}

//alert dialog for downloadDialog
private static AlertDialog showDialog(final Activity act, CharSequence title, CharSequence message, CharSequence buttonYes, CharSequence buttonNo) {
    AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
    downloadDialog.setTitle(title);
    downloadDialog.setMessage(message);
    downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Uri uri = Uri.parse("market://search?q=pname:" + "com.google.zxing.client.android");
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            try {
                act.startActivity(intent);
            } catch (ActivityNotFoundException anfe) {

            }
        }
    });
    downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
        }
    });
    return downloadDialog.show();
}

//on ActivityResult method
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            //get the extras that are returned from the intent
            String contents = intent.getStringExtra("SCAN_RESULT");
            String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
            Toast toast = Toast.makeText(this, "Content:" + contents + " Format:" + format, Toast.LENGTH_LONG);
            toast.show();
        }
    }
}

public void onClick(View arg0) {
    switch(arg0.getId()){
    
        case R.id.viewSQL:   
            
            Translator entry = new Translator(MainActivity.this);
            entry.open();
            entry.close();
            Intent i = new Intent("com.example.scanner.SQLVIEW");
            startActivity(i);
            break;
        }
    }

SQLView.java

public class SQLView extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sqlview);
    TextView tv =(TextView) findViewById(R.id.tvSQLint);
    Translator info = new Translator(this);
    info.open();
    String data = info.getData();
    info.close();
    tv.setText(data);
    

}

这是我的错误:

java.lang.RuntimeException: Unable to start activity

ComponentInfo{com.example.scanner/com.example.scanner.SQLView}: 

android.database.sqlite.SQLiteException: no such column: page_desc

(code 1):, while compiling: SELECT _id, page_desc FROM pageTable

我的错误是什么?

【问题讨论】:

  • 创建表会产生错误吗?可以分享一下吗?
  • 不,当我调试项目时,它没有出现任何错误。当我在设备中运行它时,出现错误,当我单击查看按钮(它将在数据库中显示数据)时,它说没有这样的列 page_desc
  • 您的设备可能有旧版本的数据库文件。卸载您的应用以摆脱它,然后重新安装并运行以创建一个新应用。
  • 您似乎更改了数据库。然后你应该将private static final int DATABASE_VERSION = 1; 的值增加到一个更大的数字。
  • @DerGolem 我想问你的意见,这是关于我的项目。基本上我的项目是使用二维码创建图书翻译应用程序,它的工作方式是用户使用此应用程序扫描二维码我放入每个页面,它将显示该页面的翻译(翻译将写入数据库),我看到它的工作方式是在每个 qr 代码中,我将在其中输入唯一 ID,它将连接到数据库。但我看不到如何将二维码与数据库连接起来。这可以吗,

标签: java android eclipse sqlite


【解决方案1】:

试试这个

public class Translator extends SQLiteOpenHelper {
private static final String LOGCAT = null;

public Translator(Context applicationcontext) {
    super(applicationcontext, "androidsqlite.db", null, 1);
    Log.d(LOGCAT, "Created Translator Database");
}

public static final String KEY_ROWID = "_id";
public static final String KEY_DESC = "page_desc";

private static final String DATABASE_TABLE = "pageTable";

private SQLiteDatabase ourDatabase;

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
            + " STRING PRIMARY KEY, " + KEY_DESC + " TEXT NOT NULL);");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
    onCreate(db);
}

public long createEntry(String id, String description) {
    ContentValues cv = new ContentValues();
    cv.put(KEY_ROWID, id);
    cv.put(KEY_DESC, description);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}

public long createEntry1(String id, String description) {
    ContentValues cv = new ContentValues();
    cv.put(KEY_ROWID, "P01");
    cv.put(KEY_DESC, "Snow White");
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}

public String getData() {
    // TODO Auto-generated method stub
    String[] columns = new String[] { KEY_ROWID, KEY_DESC };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
            null, null);
    String result = " ";

    int iRow = c.getColumnIndex(KEY_ROWID);
    int iDescription = c.getColumnIndex(KEY_DESC);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        result = result + c.getString(iRow) + "  "
                + c.getString(iDescription) + "  \n";
    }

    return result;

}
}

【讨论】:

  • @SmulianJulain 谢谢,它运作良好,你能解释一下你改变了什么,你能看到我的代码来查看数据吗,我需要改变什么。
  • 我有一种感觉,您调用的是活动翻译器,而不是活动翻译器中的方法 DbHelper。我对数据库了解不多,但这就是我的想法。可能就像 Der Golem 所说的那样。他不是偶然得到17K分的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2012-05-26
  • 1970-01-01
相关资源
最近更新 更多