2013-08-29 46 views
0

我刚接触android编程,并试图用集成的SQLite数据库创建应用程序。集成SQLite数据库的应用程序不断崩溃

编写从资产文件夹到内部存储器复制DB,我偶然发现了这个SQLiteAssetHelper库,并试图使用它的代码的许多失意尝试后,但它只是打开空白的应用程序屏幕,后几秒钟,它崩溃并显示消息“(AppName)已停止。”

我正在测试我的应用程序在一个真正的设备,一个没有根的三星Galaxy S3。

一些代码:

MainActivity

package com.example.database2; 

import android.os.Bundle; 
import android.app.ListActivity; 
import android.database.Cursor; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.widget.ListAdapter; 


public class MainActivity extends ListActivity { 

private Cursor employees; 
private Database db; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

db = new Database(this); 
employees = db.getEmployees(); 

ListAdapter adapter = new SimpleCursorAdapter(this, 
android.R.layout.simple_list_item_1, 
employees, 
new String[] {"name"}, 
new int[] {android.R.id.text1},0); 

getListView().setAdapter(adapter); 
} 

@Override 
protected void onDestroy() { 
super.onDestroy(); 
employees.close(); 
db.close(); 
} 


} 

SQLite的资产助手

package com.example.database2; 

import android.content.Context; 
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteQueryBuilder; 

public class Database extends SQLiteAssetHelper { 

    private static final String DATABASE_NAME = "contacts.db"; 
    private static final int DATABASE_VERSION = 1; 

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



public Cursor getEmployees() { 

SQLiteDatabase db = getReadableDatabase(); 
SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 

String [] sqlSelect = {"_id", "name", "number"}; 
String sqlTables = "contacts.db"; 

qb.setTables(sqlTables); 
Cursor c = qb.query(db, sqlSelect, null, null, 
null, null, null); 

c.moveToFirst(); 
return c; 

} 



} 

清单

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

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

    <uses-permission android:name="android.permission.READ_CONTACTS"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.database2.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> 
    </application> 

</manifest> 

很高兴如果有人可以帮忙。

编辑:

I'm发布有关logcat的,虽然它doesn't给了我太多的信息:

logcat的

E/SQLiteDatabase(3658): Failed to open database '/data/data/com.example.database2/databases/contacts'. 
E/SQLiteDatabase(3658): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
E/SQLiteDatabase(3658): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
E/SQLiteDatabase(3658): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:278) 
+0

发布logcat。 –

+0

@Ritesh Gune增加了logcat。 – Bruno

回答

0

哦,原来,这个问题很简单和愚蠢:我只是复制我的压缩数据库,以资产文件夹原来应该在资产/数据库复制用于SQLiteAssetHelper上班的时候。

创建文件夹并将数据库放入其中后,一切正常。

-1

您可以加入的logcat的输出为什么正在崩溃?

你的数据库名称是contacts.db,不是你的表名

请设置

String sqlTables = "your_table_name"; 

编辑正确的表名: 我尽量给大家简单介绍一下成在Android中使用SQLite就像我在我的一个项目中做的那样。

首先,你有一个DBHandler类:

public class DBHandler extends SQLiteOpenHelper { 

    // table names 
    public static final String TABLE_NAME = "contacts"; 

    // table column names 
    public static final String COLUMN_ID = "id"; 
    public static final String COLUMN_NAME = "name"; 
    public static final String COLUMN_NUMBER = "number"; 

    // Database Name 
    private static final String DATABASE_NAME = "contacts"; 
    private static final int DATABASE_VERSION = 1; 

    // Statements for creating tables 
    private static final String TABLE_CREATE = "CREATE TABLE " 
      + TABLE_NAME + " (" + COLUMN_ID 
      + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + COLUMN_NAME 
      + " VARCHAR(255)," + COLUMN_NUMBER + " VARCHAR(255);"; 

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

    // Create tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(TABLE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(DBHandler.class.getName(), 
       "Upgrading database from version " + oldVersion + " to " 
         + newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
    } 
} 

然后你需要处理您的查询和其他的东西一类...可以调用它的DataSource:

public class DataSource { 

// Database fields 
private SQLiteDatabase database; 
private DBHandler databaseHelper; 
private String[] allColumns = { DBHandler.COLUMN_ID, 
     DBHandler.COLUMN_NAME, DBHandler.COLUMN_NUMBER}; 

public DataSource(Context context) { 
    databaseHelper = new DBHandler(context); 
     this.open(); 
} 

public void open() throws SQLException { 
    database = databaseHelper.getWritableDatabase(); 
} 

public void close() { 
    databaseHelper.close(); 
} 

    // here you can place your custom functions 
    public Cursor getEmployees(){ 
      Cursor cursor = database.query(DBHandler.TABLE_NAME, 
      allColumns, null, null, null, null, null); 
      cursor.moveToFirst(); 
      return cursor; 
    } 
} 

在你MainActivity你做:

public class MainActivity extends ListActivity { 

     private Cursor employees; 
     private DataSource datasource; 
     private SimpleCursorAdapter adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     datasource = new DataSource(this); 
     employees = datasource.getEmployees(); 

     adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_1, 
     employees, 
     new String[] {"name"}, 
     new int[] {android.R.id.text1},0); 

     this.setListAdapter(adapter); 
    } 

    @Override 
    public void onResume() { 
     datasource.open(); 
     super.onResume(); 
    } 

    @Override 
    public void onPause() { 
     datasource.close(); 
     super.onPause(); 
    } 
} 

您的布局应该是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
    <ListView 
     android:id="@android:id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

重要的是ListView的id是android:list。

我没有测试这个特定的,但我调整了我的代码。它应该像那样工作。

+0

我的数据库和表都称为“联系人”,但我从表名中删除了.db。仍然没有变化。 – Bruno

+0

在对代码做了一些调整之后,它对我有用,但它只是创建一个空数据库,我仍然无法从资产文件夹中的数据库中复制数据。 – Bruno

+0

你必须填写数据 – MKAI