Проблема при создании базы данных в SQLite в Android - PullRequest
1 голос
/ 23 мая 2009

Привет, я новичок в Android и у меня проблема с созданием базы данных.

public class database extends ListActivity {
    /** Called when the activity is first created. */
    private final String MY_DATABASE_NAME = "myCoolUserDB.db";
    private final String MY_DATABASE_TABLE = "t_Users"; 
    Context c;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayList<String> results = new ArrayList<String>();
        setContentView(R.layout.main);
        SQLiteDatabase mydb=null;
        try
        {
            mydb.openOrCreateDatabase(MY_DATABASE_NAME,  null);

        } catch(Exception e){}
    }
}

Когда я запускаю этот код, он генерирует исключение во время выполнения. Пожалуйста, помогите мне.

Ответы [ 4 ]

3 голосов
/ 03 июля 2009
  1. Если вы собираетесь вызывать статический метод, такой как openOrCreateDatabase, делайте это в классе (SQLiteDatabase.openOrCreateDatabase (...)), а не в экземпляре. Это намного понятнее - то, как вы это сделали, выглядит так, как будто вы вызываете метод экземпляра, поэтому выглядит как верное исключение NullPointerException, которое, конечно, вводит в заблуждение.

  2. Как сказал кто-то другой, трассировка стека будет наиболее полезной при обращении за помощью с исключением.

  3. (Почти) никогда не поймать исключение, по крайней мере, не зарегистрировав его. Не делай с этим ничего. Конечно, есть исключения из каждого правила, но давайте пока не будем здесь. В любом случае, если вы по крайней мере не войдете в систему, вы просто выбрасываете информацию, которая скажет вам, что пошло не так, когда все пойдет не так.

  4. Вы не должны использовать этот метод напрямую, а вместо этого должны расширять SQLiteOpenHelper . Чтобы начать, см. Страницу разработчиков Android по хранилищу данных (я бы опубликовал ссылку, но, видимо, мне разрешено только одну ссылку в моем сообщении? в примерах, которые идут с ним для примера приложения Notepad. Он содержит класс NotePadProvider, который является хорошим примером как поставщика контента, так и доступа к базе данных, которые часто идут рука об руку на Android. Я бы посоветовал скомпилировать это приложение и внести в него некоторые простые изменения, прежде чем приступить к созданию собственного.

1 голос
/ 26 февраля 2012

Я столкнулся с той же проблемой. Он выясняет, что во время разработки произошли две ошибки

  • dir "базы данных" не существует
  • неожиданно ".db" был создан как каталог.

Они, следующие за кодом, охватывают оба

File dbFile = getDatabasePath ("abc.db");

if (dbFile.isDirectory ()) {
    dbFile.delete();
}
if (! dbFile.exists()) {
    String path = dbFile.getParent ();
    new File (path).mkdirs ();
}
database  = SQLiteDatabase.openDatabase (dbFile.getAbsolutePath (), this, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.CREATE_IF_NECESSARY);

Надеюсь, это поможет

Я думаю, что SQLiteOpenHelper полезен только для баз данных "с одной таблицей". Для приложений с несколькими таблицами я считаю, что использование SQLiteDatabase лучше подходит для хорошей архитектуры.

1 голос
/ 23 мая 2009

Для работы с базой данных sqlite необходимо создать расширенный класс из SQLiteOpenHelper:

private class DBHelper extends SQLiteOpenHelper {   

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

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

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

}   

Тогда вы можете получить доступ к БД, используя объект DbHelper:

DBHelper dbHelper = new DBHelper(Activity.this);
SQLiteDatabase db = dbHelper.getReadableDatabase();
0 голосов
/ 29 декабря 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...