当我想从android studio中的预装数据库中获取数据时应用程序出错

时间:2016-07-21 15:53:33

标签: android

以下是我的不同文件 1.MainActivity.java

RelativeLayout

}

2.HostelierDbHelper             包com.example.ganesha.myapplication;

       package com.example.ganesha.myapplication;

  import android.content.Context;
   import android.content.SharedPreferences;
   import android.database.Cursor;
  import android.database.SQLException;
   import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
   import android.support.v7.app.AppCompatActivity;
  import android.view.View;
  import android.widget.AdapterView;
  import android.widget.ArrayAdapter;
  import android.widget.Button;
  import android.widget.CursorAdapter;
  import android.widget.EditText;
   import android.widget.Spinner;
  import android.widget.Toast;

 import java.io.IOException;
     import java.util.Calendar;
      import java.util.Locale;


    public class MainActivity extends AppCompatActivity {
EditText StudentName, StudentRollno;
//String selectedmess;
Context context = this;
Cursor c = null;
public static final String Mypref = "Mypreference";
public static final String Name = "StudentName";
public static final String Rollno = "StudentRollno";
public static final String Messname = "StudentSelectedMess";
SharedPreferences sharedPreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b1;
    b1 = (Button) findViewById(R.id.button);
    sharedPreferences = getSharedPreferences(Mypref, Context.MODE_PRIVATE);
    final Spinner spinner = (Spinner) findViewById(R.id.spinner);
    ArrayAdapter<CharSequence> adapter;
    StudentName = (EditText) findViewById(R.id.name);
    StudentRollno = (EditText) findViewById(R.id.rollno);
    adapter = ArrayAdapter.createFromResource(this, R.array.mess, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ((Button) findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            HostelierDbHelper hostelierDbHelper = new HostelierDbHelper(MainActivity.this);
            try {

                hostelierDbHelper.create();

            } catch (IOException ioe) {

                throw new Error("Unable to create database");

            }

            try {

                hostelierDbHelper.open();

            } catch (SQLException sqle) {

                throw sqle;

            }
            Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show();


            Calendar sCalendar = Calendar.getInstance();
            String dayLongName = sCalendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
            String m = "Thursday";
            int res = dayLongName.compareTo(m);
            if (res == 0) {

                c = hostelierDbHelper.query("Kailash",m,null, null, null, null, null);
                if (c.moveToFirst()) {
                    do {

                        Toast.makeText(MainActivity.this,

                                        "Breakfast " + c.getString(1) + "\n" +
                                        "Lunch: " + c.getString(2) + "\n" +
                                        "Snacks:  " + c.getString(3) + "\n" +
                                        "Dinner:  " + c.getString(4),
                                Toast.LENGTH_LONG).show();

                    } while (c.moveToNext());
                }
            }
        }
    });
}

} 以下是错误记录表

        import android.content.Context;
        import android.database.Cursor;
        import android.database.SQLException;
        import android.database.sqlite.SQLiteDatabase;
        import android.database.sqlite.SQLiteException;
        import android.database.sqlite.SQLiteOpenHelper;

        import java.io.FileOutputStream;
        import java.io.IOException;
          import java.io.InputStream;
        import java.io.OutputStream;
        import java.text.SimpleDateFormat;
        import java.util.Calendar;
        import java.util.Locale;



        public class HostelierDbHelper extends SQLiteOpenHelper {
private static String DB_PATH = "";
private static String DB_NAME = "messmenus";
private static String TABLE_KAILASH = "kailash";
Cursor cursor;
//private static String TABLE_EMPLOYEE = "Employee";
//private static String TABLE_PHONE = "EmployeePhone";

private final Context context;
private SQLiteDatabase db;


public HostelierDbHelper(Context context) {
    super(context, DB_NAME, null, 1);

    if (android.os.Build.VERSION.SDK_INT >= 17) {
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    } else {
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    }
    this.context = context;
}

// Creates a empty database on the system and rewrites it with your own database.
public void create() throws IOException {
    boolean dbExist = checkDataBase();

    if (dbExist) {
        //do nothing - database already exist
    } else {
        // By calling this method and empty database will be created into the default system path
        // of your application so we are gonna be able to overwrite that database with our database.
        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }
}

// Check if the database exist to avoid re-copy the data
private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String path = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
    } catch (SQLiteException e) {
        // database don't exist yet.
        e.printStackTrace();
    }
    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;
}

// copy your assets db
private void copyDataBase() throws IOException {
    //Open your local db as the input stream
    InputStream myInput = context.getAssets().open(DB_NAME);

    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    myOutput.flush();
    myOutput.close();
    myInput.close();
}

//Open the database
public boolean open() {
    try {
        String myPath = DB_PATH + DB_NAME;
        db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
        return true;
    } catch (SQLException sqle) {
        db = null;
        return false;
    }
}

@Override
public synchronized void close() {
    if (db != null)
        db.close();
    super.close();
}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

// Calendar sCalendar=Calendar.getInstance();
// String dayLongName = sCalendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
// String m="Monday";
//  int res=dayLongName.compareTo(m);
// if(res == 0){

public Cursor query(String table, String columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) {
    return db.query("Kailash", new String[]{columns},null, null, null, null, null);

}

为什么在已有数据库和表database image

时会出现错误

1 个答案:

答案 0 :(得分:0)

最简单的一个没有控制版本的是,

private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " ( " + [Your Field definitions here] + " )";



@Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_TABLE);
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }

您在堆栈跟踪中遇到的问题是您在不创建数据库的情况下查询数据库。