2014-10-22 152 views
1

我想开发一个应用程序,我需要在Android中使用SQLite数据库。下面是显示的代码,它正在实现数据库以及我的应用程序随机数据所需的所有操作(只是为了首先成功实现逻辑)。没有这样的表 - 在SQLite中插入错误的值Android

此代码写入DBHelperDisplay.java,它由MainActivity.java通过intent调用。

我DBHelperDisplay.java:

package course.examples.jumboquest; 

import java.util.Random; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
//import android.widget.EditText; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.TextView; 
//import android.content.Intent; 
import android.os.CountDownTimer; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.DatabaseUtils; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase; 

public class DBHelperDisplay extends ActionBarActivity { 

TextView tv; 
DBHelper myDB; 
RadioGroup radioChoices; 
RadioButton rbtChoice; 
Button btSubmit; 
String choice1; 
String choice2; 
String choice3; 
String choice4; 
String strAns; 
CustomTimer cdt; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.dbhelper_display); 

    cdt = new CustomTimer(20000, 1000); 
    cdt.start(); 

    myDB = new DBHelper(this); 

    myDB.insertQuestion(1, "who is the team member whose name starts with s?", "Vinita", "Akanksha", "Swati", "Megha", "Swati"); 
    myDB.insertQuestion(2, "who is the team member whose name starts with m?", "Vinita", "Akanksha", "Swati", "Megha", "Megha"); 
    myDB.insertQuestion(3, "who is the team member whose name starts with a?", "Vinita", "Akanksha", "Swati", "Megha", "Akanksha"); 
    myDB.insertQuestion(4, "who is the team member whose name starts with v?", "Vinita", "Akanksha", "Swati", "Megha", "Vinita"); 
    myDB.insertQuestion(5, "who is the team member whose name ends with i?", "Vinita", "Akanksha", "Swati", "Megha", "Swati"); 

    Cursor rs = myDB.getData(); 
    String Question = rs.getString(rs.getColumnIndex(DBHelper.Col_Ques)); 
    choice1 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice1)); 
    choice2 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice2)); 
    choice3 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice3)); 
    choice4 = rs.getString(rs.getColumnIndex(DBHelper.Col_Choice4)); 
    strAns = rs.getString(rs.getColumnIndex(DBHelper.Col_Ans)); 


    tv = (TextView) findViewById(R.id.timertxt); 

    final TextView quest = (TextView) findViewById(R.id.quest); 
    quest.setText(Question); 

    //final TextView ans = (TextView) findViewById(R.id.ans); 

    Button btClear = (Button)findViewById(R.id.btClear); 
    btClear.setText("CLEAR"); 

    addListenerRadioChoices() ; 

    btClear.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v) { 
     //ans.setText(""); 

     } 
    }); 
} 
    public void addListenerRadioChoices(){ 

    radioChoices = (RadioGroup) findViewById(R.id.radioChoices); 

    ((RadioButton) radioChoices.getChildAt(0)).setText(choice1); 
    ((RadioButton) radioChoices.getChildAt(1)).setText(choice2); 
    ((RadioButton) radioChoices.getChildAt(2)).setText(choice3); 
    ((RadioButton) radioChoices.getChildAt(3)).setText(choice4); 

    btSubmit = (Button)findViewById(R.id.btSubmit); 
    btSubmit.setText("SUBMIT"); 
    btSubmit.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v) { 

     int selected = radioChoices.getCheckedRadioButtonId(); 
     rbtChoice = (RadioButton) findViewById(selected); 
     String Ans = rbtChoice.getText().toString(); 
     if(Ans.equalsIgnoreCase(strAns)){ 

      cdt.cancel(); 
      //ans.setText(" ANSWER"); 

     } 
     /* else{ 
      // ans.setText("WRONG ANSWER"); 
     }*/ 

    } 
    }); 
    } 

public class CustomTimer extends CountDownTimer{ 
    //TextView ed; 
    public CustomTimer(long millisInFuture, long countDownInterval){ 
     super(millisInFuture, countDownInterval); 
    } 
    @Override 
    public void onTick(long millisUntilFinished){ 
     //current = millisUntilFinished/1000; 
     tv.setText("Time Left:" + millisUntilFinished/1000); 
    } 
    @Override 
    public void onFinish() { 
     tv.setText("Time Up - lost the game!"); 
    } 
} 

public class DBHelper extends SQLiteOpenHelper { 

    public static final String Database_Name = "Questions.db"; 
    public static final String Table_Name = "Comics"; 
    public static final String Col_ID = "id"; 
    public static final String Col_Ques = "question"; 
    public static final String Col_Choice1 = "choice1"; 
    public static final String Col_Choice2 = "choice2"; 
    public static final String Col_Choice3 = "choice3"; 
    public static final String Col_Choice4 = "choice4"; 
    public static final String Col_Ans = "answer"; 

    public DBHelper(Context context){ 
     super(context, Database_Name, null, 1); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db){ 
     // TODO Auto-generated method stub 
     db.execSQL(
     "CREATE TABLE Comics" + 
     "(id integer primary key, question text, choice1 text, choice2 text, choice3 text, choice4 text, answer text)"); 

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

    public boolean insertQuestion(int id, String question, String choice1, String choice2, String choice3, String choice4, String answer){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 

     contentValues.put("id",id); 
     contentValues.put("question",question); 
     contentValues.put("choice1",choice1); 
     contentValues.put("choice2",choice2); 
     contentValues.put("choice3",choice3); 
     contentValues.put("choice4",choice4); 
     contentValues.put("answer",answer); 
     db.insert("Comics", null, contentValues); 
     db.close(); 
     return true; 
    } 
    public Cursor getData(){ 
     SQLiteDatabase db = this.getReadableDatabase(); 
     int numRows = (int)DatabaseUtils.queryNumEntries(db,Table_Name); 
     int min = 1; 
     int max = numRows; 
     Random r = new Random(); 
     int id = r.nextInt(max - min + 1) + min; 
     Cursor res= db.rawQuery("Select * from Comics where id = " + id + "", null); 
     return res; 
    } 
} 

}

我的AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="course.examples.jumboquest" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="21" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".DBHelperDisplay"></activity> 
</application> 

</manifest> 

在执行上面的代码,我收到以下错误:

logcat file

我已经搜索了很多,发现许多堆栈溢出链接有相同的问题,但仍然没有解决。我是这个主题的新手。请帮帮我。

logCat file2

+1

卸载并重新安装应用程序,以摆脱可能的旧版本的数据库文件。 http://stackoverflow.com/questions/21881992/when-is-sqliteopenhelper-oncreate-onupgrade-run – laalto 2014-10-22 10:29:23

+1

在卸载之前,请确保清除数据。 :) – 2014-10-22 10:32:36

+1

@MysticMagic卸载也许是清除数据最直接的方法。仅清除数据也是可行的,但需要更长时间的解释。 – laalto 2014-10-22 10:34:26

回答

3

我有两个适配器:

公共类DBController_for_drivinglicense扩展SQLiteOpenHelper {

public DBController_for_drivinglicense(Context applicationcontext) { 
    super(applicationcontext,"nozadb", null, 1); 

} 
//Creates Table 
@Override 
public void onCreate(SQLiteDatabase database) { 

    String query; 
    query = "CREATE TABLE if not exists drivinglicense (id INTEGER PRIMARY KEY, comment TEXT,rates float,names TEXT,date DEFAULT CURRENT_TIMESTAMP, udpateStatus TEXT)"; 
    database.execSQL(query); 
} 

第一适配器是:

public DBController_for_landregistration(Context applicationcontext) { 
    super(applicationcontext,"nozadb", null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 
    String query; 

    query = "CREATE TABLE if not exists landregistration (id INTEGER PRIMARY KEY, comment TEXT,rates float,names TEXT,date DEFAULT CURRENT_TIMESTAMP, udpateStatus TEXT)"; 
    database.execSQL(query); 

} 

当我改变了第二个到:

公共类DBController_for_drivinglicense扩展SQLiteOpenHelper {

public DBController_for_drivinglicense(Context applicationcontext) { 
    super(applicationcontext,"nozadb", null, 2); 
} 
//Creates Table 
@Override 
public void onCreate(SQLiteDatabase database) { 

    String query; 
    query = "CREATE TABLE if not exists drivinglicense (id INTEGER PRIMARY KEY, comment TEXT,rates float,names TEXT,date DEFAULT CURRENT_TIMESTAMP, udpateStatus TEXT)"; 
    database.execSQL(query); 

} 
+0

非常感谢,它工作:)。但现在它显示NullPointerException。我不知道为什么。你能否再次通过我的代码? – 2014-10-22 10:53:23

+1

nullpointerexception在哪一行出现? – nunoh123 2014-10-22 10:57:04

+0

我已经上传了logcat文件的图片。我也在努力寻找自己。如果你能解决它,请让我知道。 – 2014-10-22 11:05:29