我发现我使用的外部数据库无法通过查询活动(DataConn.java)来访问。
应用MainActivity.java
的主菜单是显示的,但是当我按下按钮并重定向到另一个布局活动ingameinterface.java
时,它会崩溃。 T ^ T
我怎么能解决这个问题?请帮忙!
DataConn.java
package com.example.hamira.wordmatchinggame;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.Random;
public class DataConn extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "db_vocabulary.db";
private static final String DB_PATH = "data/data/com.exampasle.hamira.wordmatchinggame/databases/";
private static final String TABLE_NAME = "tblwords";
private SQLiteDatabase db;
static int taksi, pamato, a;
public DataConn(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public Cursor getAllData(){
Random r = new Random();
int patad = r.nextInt(41 - 0) + 1;
pamato = patad;
db = this.getWritableDatabase();
Cursor res = db.rawQuery("select " +
"max(case when Key_Word = 'Questn' then Val end) Question,\n" +
"max(case when Key_Word = 'Defi' then Val end) Definition,\n" +
"max(case when Key_Word = 'Cc1' then Val end) Choice1,\n" +
"max(case when Key_Word = 'Cc2' then Val end) Choice2,\n" +
"max(case when Key_Word = 'Cc3' then Val end) Choice3,\n" +
"max(case when Key_Word = 'Cc4' then Val end) Choice4,\n" +
"max(case when Key_Word = 'Ans' then Val end) Answer,\n" +
"max(case when Key_Word = 'Stats' then Val end) Status\n" +
"from "+TABLE_NAME+" where prima = '"+pamato+"'", null);
res.close();
return res;
}
public Cursor getScore(){
db = this.getWritableDatabase();
Cursor sc = db.rawQuery("select crntscore from TblScore",null);
return sc;
}
public Cursor UpdateScore(){
taksi=ingameinterface.passScore;
a = taksi+1;
db = this.getWritableDatabase();
Cursor us = db.rawQuery("update TblScore set crntscore='"+a+"'",null);
us.moveToFirst();
us.close();
return us;
}
public Cursor DropPrima(){
db = this.getWritableDatabase();
Cursor udp = db.rawQuery("update TblWords set Val = '1' where CtrlNo = '8' " +
"and Prima ='"+pamato+"'",null);
udp.moveToFirst();
udp.close();
return udp;
}
public Cursor ResetPrima(){
int a = ingameinterface.passPrima;
db = this.getWritableDatabase();
Cursor udp = db.rawQuery("update TblWords set Val = '0' where CtrlNo = '8' " +
"and Prima ='"+a+"'",null);
udp.moveToFirst();
udp.close();
return udp;
}
public Cursor ResetScore(){
db = this.getWritableDatabase();
Cursor us = db.rawQuery("update TblScore set crntscore='0'",null);
us.moveToFirst();
us.close();
return us;
}
}
MainActivity.java
package com.example.hamira.wordmatchinggame;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Intent game;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
game = new Intent( MainActivity.this, ingameinterface.class);
TextView btnstrt = (TextView) findViewById(R.id.btnStartGame);
btnstrt.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
startActivity(game);
}
});
final View btnoff = (ImageButton) findViewById(R.id.imgBtnVoloff);
final View btnon = (ImageButton) findViewById(R.id.imgBtnVolon);
btnon.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (v == btnon) {
btnoff.setVisibility(View.VISIBLE);
btnon.setVisibility(View.GONE);
//TURN OFF AUDIO
}
}
});
btnoff.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (v == btnoff) {
btnoff.setVisibility(View.GONE);
btnon.setVisibility(View.VISIBLE);
//TURN ON AUDIO
}
}
});
TextView btnexit = (TextView) findViewById(R.id.btnQuit);
btnexit.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0){
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
});
}
}
ingameinterface.java
package com.example.hamira.wordmatchinggame;
import android.app.Activity;
import android.content.DialogInterface;
import android.database.Cursor;
import android.support.v7.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Random;
public class ingameinterface extends Activity {
DataConn myDb;
String holdQstn, holdDefi, holdCc1, holdCc2, holdCc3, holdCc4,holdAns, holdStats;
static int DBscore, passScore;
static int patad, passPrima;
TextView TVScore;
TextView TVWord, TVDefi, TVCc1, TVCc2, TVCc3, TVCc4;
Button ResetBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ingameinterface);
myDb = new DataConn(this);
CharSequence text = "GAME ON !";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(this, text, duration);
toast.show();
rand();
hereWeGo();
ShowMyScore();
//BUTTON CHOICE 1
TVCc1 = (TextView) findViewById(R.id.itmCc1);
TVCc1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
String BtnText1 = TVCc1.getText().toString();
if(holdAns.equals(BtnText1)){
Toast.makeText(getApplicationContext(), BtnText1+" is the correct answer. " +
"Excellent!", Toast.LENGTH_SHORT).show();
performAddScore();
ShowMyScore();
dropPrima();
hereWeGo();
}else
{
Toast.makeText(getApplicationContext(), "Wrong Answer", Toast.LENGTH_SHORT).show();
hereWeGo();
}
}
});
//BUTTON CHOICE 2
TVCc2 = (TextView) findViewById(R.id.itmCc2);
TVCc2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
String BtnText2 = TVCc2.getText().toString();
if(holdAns.equals(BtnText2)){
Toast.makeText(getApplicationContext(), BtnText2+" is the correct answer. " +
"Excellent!", Toast.LENGTH_SHORT).show();
performAddScore();
ShowMyScore();
dropPrima();
hereWeGo();
}else
{
Toast.makeText(getApplicationContext(), "Wrong Answer", Toast.LENGTH_SHORT).show();
hereWeGo();
}
}
});
//BUTTON CHOICE 3
TVCc3 = (TextView) findViewById(R.id.itmCc3);
TVCc3.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
String BtnText3 = TVCc3.getText().toString();
if(holdAns.equals(BtnText3)){
Toast.makeText(getApplicationContext(), BtnText3+" is the correct answer. " +
"Excellent!", Toast.LENGTH_SHORT).show();
performAddScore();
ShowMyScore();
dropPrima();
hereWeGo();
}else
{
Toast.makeText(getApplicationContext(), "Wrong Answer", Toast.LENGTH_SHORT).show();
hereWeGo();
}
}
});
//BUTTON CHOICE 4
TVCc4 = (TextView) findViewById(R.id.itmCc4);
TVCc4.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
String BtnText4 = TVCc4.getText().toString();
if(holdAns.equals(BtnText4)){
Toast.makeText(getApplicationContext(), BtnText4+" is the correct answer. " +
"Excellent!", Toast.LENGTH_SHORT).show();
performAddScore();
ShowMyScore();
dropPrima();
hereWeGo();
}else
{
Toast.makeText(getApplicationContext(), "Wrong Answer", Toast.LENGTH_SHORT).show();
hereWeGo();
}
}
});
ResetBtn = (Button) findViewById(R.id.btnReset);
ResetBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
AlertDialog.Builder build = new AlertDialog.Builder(ingameinterface.this);
build.setTitle("Reset Confirmation");
build.setMessage("Do you want to reset the game?");
build.setPositiveButton("YES", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
//BUTTON YES
for(int a=1; a!=41; a++){
passPrima = a;
myDb.ResetPrima();
}
myDb.ResetScore();
hereWeGo();
ShowMyScore();
Toast.makeText(getApplicationContext(), "Game reset successfully!", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
build.setNegativeButton("NO", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
//BUTTON NO
Toast.makeText(getApplicationContext(), "No", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
AlertDialog wew = build.create();
wew.show();
}
});
}//onCreate END
public void rand(){
Random r = new Random();
patad = r.nextInt(41 - 0) + 1;
}
public void hereWeGo(){
Cursor res = myDb.getAllData();
if(res.getCount() == 0){
Toast.makeText(getApplicationContext(), "Error!", Toast.LENGTH_SHORT).show();
return;
}
while (res.moveToNext()){
holdQstn = String.valueOf(res.getString(0));
holdDefi = String.valueOf(res.getString(1));
holdCc1 = String.valueOf(res.getString(2));
holdCc2 = String.valueOf(res.getString(3));
holdCc3 = String.valueOf(res.getString(4));
holdCc4 = String.valueOf(res.getString(5));
holdAns = String.valueOf(res.getString(6));
holdStats = String.valueOf(res.getString(7));
if (holdStats.equals("1")){
reRollCall();
}else{
TVWord= (TextView) findViewById(R.id.itmWORD);
String StrngToTVQstn = holdQstn;
TVWord.setText("'"+StrngToTVQstn+"'");
TVDefi= (TextView) findViewById(R.id.itmDefi);
String StrngToTVDefi = holdDefi;
TVDefi.setText(StrngToTVDefi);
TVCc1= (TextView) findViewById(R.id.itmCc1);
String StrngToTVCc1 = holdCc1;
TVCc1.setText(StrngToTVCc1);
TVCc2= (TextView) findViewById(R.id.itmCc2);
String StrngToTVCc2 = holdCc2;
TVCc2.setText(StrngToTVCc2);
TVCc3= (TextView) findViewById(R.id.itmCc3);
String StrngToTVCc3 = holdCc3;
TVCc3.setText(StrngToTVCc3);
TVCc4= (TextView) findViewById(R.id.itmCc4);
String StrngToTVCc4 = holdCc4;
TVCc4.setText(StrngToTVCc4);
}
}
}
public void reRollCall(){
hereWeGo();
}
public void performAddScore(){
Random r = new Random();
patad = r.nextInt(41 - 0) + 1;
myDb.UpdateScore();
}
public void ShowMyScore(){
Cursor sc = myDb.getScore();
while (sc.moveToNext()){
DBscore= Integer.valueOf(sc.getInt(0));
passScore = DBscore;
TVScore= (TextView) findViewById(R.id.itmSCORE);
TVScore.setText(String.valueOf(passScore));
}
}
public void dropPrima(){
myDb.DropPrima();
}
}//class END
编辑:抱歉!错误的logcat粘贴。
UPDATED logcat
08-02 11:56:54.418 17223-17223/com.example.hamira.wordmatchinggame E/SQLiteLog: (1) no such table: tblwords 08-02 11:56:54.419 17223-17223/com.example.hamira.wordmatchinggame D/AndroidRuntime: Shutting down VM 08-02 11:56:54.420 17223-17223/com.example.hamira.wordmatchinggame E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hamira.wordmatchinggame, PID: 17223
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hamira.wordmatchinggame/com.example.hamira.wordmatchinggame.ingameinterface}: android.database.sqlite.SQLiteException: no such table: tblwords (code 1): , while compiling: select max(case when Key_Word = 'Questn' then Val end) Question,
max(case when Key_Word = 'Defi' then Val end) Definition,
max(case when Key_Word = 'Cc1' then Val end) Choice1,
max(case when Key_Word = 'Cc2' then Val end) Choice2,
max(case when Key_Word = 'Cc3' then Val end) Choice3,
max(case when Key_Word = 'Cc4' then Val end) Choice4,
max(case when Key_Word = 'Ans' then Val end) Answer,
max(case when Key_Word = 'Stats' then Val end) Status
from tblwords where prima = '8'
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2525)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2617)
at android.app.ActivityThread.access$800(ActivityThread.java:182)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1474)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:218)
at android.app.ActivityThread.main(ActivityThread.java:5657)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:990)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:785)
Caused by: android.database.sqlite.SQLiteException: no such table: tblwords (code 1): , while compiling: select max(case when Key_Word = 'Questn' then Val end) Question,
max(case when Key_Word = 'Defi' then Val end) Definition,
max(case when Key_Word = 'Cc1' then Val end) Choice1,
max(case when Key_Word = 'Cc2' then Val end) Choice2,
max(case when Key_Word = 'Cc3' then Val end) Choice3,
max(case when Key_Word = 'Cc4' then Val end) Choice4,
max(case when Key_Word = 'Ans' then Val end) Answer,
max(case when Key_Word = 'Stats' then Val end) Status
from tblwords where prima = '8'
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1346)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1285)
at com.example.hamira.wordmatchinggame.DataConn.getAllData(DataConn.java:38)
at com.example.hamira.wordmatchinggame.ingameinterface.hereWeGo(ingameinterface.java:167)
at com.example.hamira.wordmatchinggame.ingameinterface.onCreate(ingameinterface.java:37)
at android.app.Activity.performCreate(Activity.java:6135)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2472)
... 10 more 08-02 11:56:54.474 17223-17223/com.example.hamira.wordmatchinggame I/Process: Sending signal. PID: 17223 SIG: 9
答案 0 :(得分:0)
在模拟器中,您在路径/数据/数据中推送了数据库。这就是它在模拟器中工作的原因。
但是在真实设备中,你没有将数据库推送到这条路径。这就是为什么崩溃说“android.database.sqlite.SQLiteException:没有这样的表”。
PS:/ data / data,是一个安全路径。如果要将数据库移动到此路径。你需要写一些代码。
答案 1 :(得分:0)
在onCreate(SQLiteDatabase db)
中你必须执行脚本来创建数据库表ex,
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS table1 (field1 VARCHAR,field2 VARCHAR);");
db.execSQL("CREATE TABLE IF NOT EXISTS table2 (field1 VARCHAR,field2 VARCHAR);");
//... etc
}
现在,在添加正确的create-table脚本后,从设备卸载app并再次运行该项目。它应该创建表格,它会正常工作。
您需要阅读有关sqlite帮助程序类及其工作原理的更多信息。