SQLiteException: такая таблица не найдена, тогда как таблица была создана

В этом приложении у меня есть два activities, один для отправки location пользователя, а другой для отображения listView, где каждая строка содержит имя и номер телефона. Записи listView хранятся в файле sqlitedatabse. activity, который содержит listView, не показывает ошибки при вводе имени и номера телефона, но activity, который содержит кнопку для отправки location на номера, сохраненные в sqlitedatabse, показывает ошибку

android.database.sqlite.SQLiteException: нет такой таблицы: UserDataB (код 1): при компиляции: SELECT * FROM UserDataB

где UserDataB это table name. Я проверил эту ссылку потому что ошибка была похожа на мою, но это не помогло мне решить проблему. Код приведен ниже:

База пользовательских данных

public class UserDatabase extends SQLiteOpenHelper {

// Table Name
public static final String TABLE_NAME = "UserDataB";

// Table columns
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String NUMBER = "phonenumber";

// Database Information
static final String DB_NAME = "User_Details.DB";

// database version
static final int DB_VERSION = 1;

// Creating table query
private static final String CREATE_TABLE = "create table " + TABLE_NAME + "(" + _ID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT NOT NULL, " + NUMBER + " TEXT);";

public UserDatabase(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

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

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}
}

Код для activity, в котором location отправляется в записи в sqlitedatabse, приведен ниже:

Активность

    public class Gps4Activity extends AppCompatActivity implements
        GoogleApiClient.OnConnectionFailedListener {

    private static final String LOG_TAG = "PlacesAPIActivity";
    private static final int GOOGLE_API_CLIENT_ID = 0;
    private GoogleApiClient mGoogleApiClient;
    private static final int PERMISSION_REQUEST_CODE = 100;
    private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =0 ;
    private TextView display;
    private Button location_button,contacts_button;
    //String number="xxxxxxxxxx";

    ArrayList<String> numbers;
    SQLiteDatabase db;

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

        numbers=new ArrayList<>();
        db=Gps4Activity.this.openOrCreateDatabase("User_Details",MODE_PRIVATE,null);


        location_button=(Button)findViewById(R.id.show_button);
        contacts_button=(Button)findViewById(R.id.view_button);
        display=(TextView)findViewById(R.id.location_textview);

        mGoogleApiClient = new GoogleApiClient.Builder(Gps4Activity.this)
                .addApi(Places.PLACE_DETECTION_API)
                .enableAutoManage(this, GOOGLE_API_CLIENT_ID, this)
                .build();

        location_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mGoogleApiClient.isConnected()) {
                    if (ActivityCompat.checkSelfPermission(Gps4Activity.this,
                            android.Manifest.permission.ACCESS_FINE_LOCATION)
                            != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(Gps4Activity.this,
                                new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                                PERMISSION_REQUEST_CODE);
                        ActivityCompat.requestPermissions(Gps4Activity.this,
                                new String[]{Manifest.permission.SEND_SMS},
                                MY_PERMISSIONS_REQUEST_SEND_SMS);
                    }
                }
                callPlaceDetectionApi();
            }
        });

        contacts_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Gps4Activity.this,DetailsActivity.class);
                startActivity(intent);
            }
        });
    }




    public ArrayList<String> getContacts(){

        Cursor cursor=db.rawQuery("SELECT * FROM "+UserDatabase.TABLE_NAME,null);
        db.execSQL("create table " + UserDatabase.TABLE_NAME + "(" + UserDatabase._ID
                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + UserDatabase.NAME + " TEXT NOT NULL, " +
                UserDatabase.NUMBER + " TEXT);");

        while (cursor.moveToNext()){
            String contact=cursor.getString(cursor.getColumnIndex(UserDatabase.NUMBER));
            numbers.add(contact);
        }
        return numbers;
    }




    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.e(LOG_TAG, "Google Places API connection failed with error code: "
                + connectionResult.getErrorCode());

        Toast.makeText(this,
                "Google Places API connection failed with error code:" +
                        connectionResult.getErrorCode(),
                Toast.LENGTH_LONG).show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    callPlaceDetectionApi();
                } else {
                    Toast.makeText(getApplicationContext(),
                            "SMS faild, please try again.", Toast.LENGTH_LONG).show();
                    return;
                }
                break;

        }
    }


    private void callPlaceDetectionApi() throws SecurityException {
        PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
                .getCurrentPlace(mGoogleApiClient, null);
        result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
            @Override
            public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
                for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                    Log.i(LOG_TAG, String.format("Place '%s' with " +
                                    "likelihood: %g",
                            placeLikelihood.getPlace().getName(),
                            placeLikelihood.getLikelihood()));
                    display.setText(placeLikelihood.getPlace().getAddress().toString());
                    messageSending(placeLikelihood.getPlace().getAddress().toString());
                    break;
                }
                likelyPlaces.release();

            }
        });
    }

    public void messageSending(String message){
        SmsManager smsManager = SmsManager.getDefault();
//        smsManager.sendTextMessage(number, null, message, null, null);
        getContacts();
        smsManager.sendTextMessage(String.valueOf(numbers),null,message,null,null);
        Toast.makeText(getApplicationContext(), "SMS sent."+String.valueOf(numbers),
                Toast.LENGTH_LONG).show();
    }


}

person Pritom Mazumdar    schedule 19.10.2017    source источник


Ответы (1)


Вы работаете с двумя разными файлами базы данных, User_Details и User_Details.DB.

Если вы используете SQLiteOpenHelper для управления своей базой данных, используйте его последовательно. Например, заменить

db=Gps4Activity.this.openOrCreateDatabase("User_Details",MODE_PRIVATE,null);

с чем-то вроде

db = new UserDatabase(this).getReadableDatabase();

чтобы фактически использовать помощник для создания базы данных и таблиц для вас, и удалить код CREATE TABLE, которого нет в помощнике.

person laalto    schedule 19.10.2017
comment
Большое спасибо, у меня была еще одна проблема - person Pritom Mazumdar; 19.10.2017
comment
Теперь, когда приложение не падает, когда я нажимаю на location_button, ожидаемое поведение будет заключаться в том, что оно отправляет location в запись в sqlitedatabase, но этого не происходит, но отображается сообщение toast «SMS отправлено». ххххххх - person Pritom Mazumdar; 19.10.2017