Android 数据库应用程序崩溃
目前正在创建一个应用程序,该应用程序从资产中复制sql数据库,然后允许我按年份、电影名称进行查询搜索,并在文本视图中显示所有结果。出现致命错误,导致应用程序立即崩溃,不知道该怎么办。。在代码下包含了给出错误的行 活动\u main.xmlAndroid 数据库应用程序崩溃,android,android-sqlite,Android,Android Sqlite,目前正在创建一个应用程序,该应用程序从资产中复制sql数据库,然后允许我按年份、电影名称进行查询搜索,并在文本视图中显示所有结果。出现致命错误,导致应用程序立即崩溃,不知道该怎么办。。在代码下包含了给出错误的行 活动\u main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.artis.sqldatabase.MainActivity">
<TableRow
android:id="@+id/MainTable"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/ApplicationView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Robin Williams Filmography"
android:textColor="@android:color/black"
android:textSize="18sp" />
</TableRow>
<TableRow
android:id="@+id/SearchTable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/MainTable">
<EditText
android:id="@+id/YearEdit"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Year"
android:inputType="number" />
<EditText
android:id="@+id/MovieEdit"
android:layout_width="283dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Movie Name"
android:inputType="textPersonName" />
</TableRow>
<TableRow
android:id="@+id/ButtonTable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/SearchTable">
<Button
android:id="@+id/YearButton"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="Search By Year" />
<Button
android:id="@+id/MovieButton"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="Search By Movie" />
<Button
android:id="@+id/AllButton"
android:layout_width="84dp"
android:layout_height="wrap_content"
android:text="All" />
</TableRow>
<TableRow
android:id="@+id/ResultTable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/ButtonTable" >
<TextView
android:id="@+id/ResultView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</TableRow>
</RelativeLayout>
OpenDatabase.java
package com.example.artis.sqldatabase;
import android.app.Activity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MainActivity extends Activity
{
private static final String DATABASE_PATH =
"/data/data/com.example.artis.sqldatabase/databases/";
private static final String DATABASE_PATH2 =
"/data/data/com.example.artis.sqldatabase/databases";
private static final String DATABASE_NAME = "ActorsFilmography.db";
private static final String LOG_TAG = "FILMOGRAPHY_DB";
Context ctx;
OpenDatabase sqh;
SQLiteDatabase sqdb;
Button YearButton;
Button MovieButton;
Button AllButton;
EditText YearEdit;
EditText MovieEdit;
TextView ResultView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUpDatabase();
InitDataBase();
SetupControls();
}
public void SetupControls()
{
YearEdit = (EditText)findViewById(R.id.YearEdit);
MovieEdit = (EditText)findViewById(R.id.MovieEdit);
ResultView = (TextView)findViewById(R.id.ResultView);
YearButton = (Button)findViewById(R.id.YearButton);
MovieButton = (Button)findViewById(R.id.MovieButton);
AllButton = (Button)findViewById(R.id.AllButton);
AllButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
ResultView.setText("");
ResultView.setText(sqh.DisplayRecords(sqdb));
}
});
YearButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
ResultView.setText("");
ResultView.setText(sqh.DisplayRecordsBasedOnYear(sqdb, ResultView.getText().toString()));
}
});
MovieButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
ResultView.setText("");
ResultView.setText(sqh.DisplayRecordsBasedOnMovie(sqdb, ResultView.getText().toString()));
}
});
}
public void InitDataBase()
{
sqh = new OpenDatabase(this);
sqdb = sqh.getWritableDatabase();
}
public void setUpDatabase()
{
ctx = this.getBaseContext();
try
{
CopyDataBaseFromAsset();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void CopyDataBaseFromAsset() throws IOException
{
InputStream in = ctx.getAssets().open(DATABASE_NAME);
Log.w( LOG_TAG , "Starting copying...");
String outputFileName = DATABASE_PATH + DATABASE_NAME;
File databaseFolder = new File( DATABASE_PATH2 );
if ( !databaseFolder.exists() )
{
databaseFolder.mkdir();
OutputStream out = new FileOutputStream(outputFileName);
byte[] buffer = new byte[1024];
int length;
while ( (length = in.read(buffer)) > 0 )
{
out.write(buffer,0,length);
}
out.flush();
out.close();
in.close();
Log.w(LOG_TAG, "Completed.");
}
}
}
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class OpenDatabase extends SQLiteOpenHelper
{
private static final String DATABASE_NAME = "src/main/ActorsFilmography.db";
private static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "Filmography";
OpenDatabase(Context context)
{
super( context, DATABASE_NAME, null, DATABASE_VERSION );
}
@Override
public void onCreate(SQLiteDatabase db)
{
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
public String DisplayRecords(SQLiteDatabase sqdb)
{
String str = "";
Cursor c = sqdb.rawQuery("SELECT * FROM Filmography", null);
if (c != null)
{
if (c.moveToFirst())
{
do
{
String id = c.getString(0);
str = str + id + ",";
String Year = c.getString(1);
str = str + Year + ",";
String FilmTitle = c.getString(4);
str = str + FilmTitle + "\n";
Log.w("FILMOGRAPHY", "ID = " + id + " Songtitle = " + Year + " Movie Title = " + FilmTitle);
} while (c.moveToNext());
}
}
c.close();
return str;
}
public String DisplayRecordsBasedOnYear(SQLiteDatabase sqdb, String searchYear)
{
String str = "";
Cursor c = sqdb.rawQuery("SELECT * FROM Filmography WHERE YEAR = '" + searchYear + "';", null);
if (c != null)
{
if (c.moveToFirst())
{
do
{
String id = c.getString(0);
str = str + id + ",";
String Year = c.getString(1);
str = str + Year + ",";
String FilmTitle = c.getString(4);
str = str + FilmTitle + "\n";
Log.w("FILMOGRAPHY", "ID = " + id + " Songtitle = " + Year + " Movie Title = " + FilmTitle);
} while (c.moveToNext());
}
else
{
str = "No records found";
}
}
c.close();
return str;
}
public String DisplayRecordsBasedOnMovie(SQLiteDatabase sqdb, String searchFilmTitle)
{
String str = "";
Cursor c = sqdb.rawQuery("SELECT * FROM Filmography WHERE MOVIE = '" + searchFilmTitle + "';", null);
if (c != null)
{
if (c.moveToFirst())
{
do
{
String id = c.getString(0);
str = str + id + ",";
String Year = c.getString(1);
str = str + Year + ",";
String FilmTitle = c.getString(4);
str = str + FilmTitle + "\n";
Log.w("FILMOGRAPHY", "ID = " + id + " Songtitle = " + Year + " Movie Title = " + FilmTitle);
} while (c.moveToNext());
}
else
{
str = "No records found";
}
}
c.close();
return str;
}
}
我当前收到的错误在MainActivity.java第48行和第96行。它们是:
InitDataBase()
和sqdb=sqh.getWritableDatabase()代码>
应用程序刚刚崩溃。。日志:
12-01 22:11:33.806 3784-3784/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.artis.sqldatabase, PID: 3784
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.artis.sqldatabase/com.example.artis.sqldatabase.MainActivity}: java.lang.IllegalArgumentException: File src/main/ActorsFilmography.db contains a path separator
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.IllegalArgumentException: File src/main/ActorsFilmography.db contains a path separator
at android.app.ContextImpl.makeFilename(ContextImpl.java:2165)
at android.app.ContextImpl.getDatabasePath(ContextImpl.java:695)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:644)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:289)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.example.artis.sqldatabase.MainActivity.InitDataBase(MainActivity.java:96)
at com.example.artis.sqldatabase.MainActivity.onCreate(MainActivity.java:48)
at android.app.Activity.performCreate(Activity.java:6679)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
问题(最有可能是错误,没有检查整个代码,只是当前的问题)是您的DB名称。
您声明:
private static final String DATABASE_NAME = "src/main/ActorsFilmography.db";
它包含一个路径分隔符(即“/”)。这是不允许的。
如果将其更改为ActorFilmography
,它可能会解决此问题(没有.db
,因为它已经将扩展名设置为.db
,因为它是一个数据库)。
此外,请注意留下的评论,对于以后的提问,请参考您尝试过什么?你是怎么做到这一点的?请参阅此处,以了解有关问题风格的一些详细信息,这些问题往往会得到有用的答案。这很有效,谢谢,但现在它在logcatandroid.database.sqlite.SQLiteException:没有这样的表:从影记录(代码1):,编译时:当我在数据库中创建了一个名为Filmography@Bubuuh我建议你仔细阅读这个主题本身,或者,这是一个基本的问题,你可以通过谷歌搜索或点击我在这里链接的一个链接来解决。好的,谢谢。。因为我遇到的主要问题已经解决了,所以我仍然会将其标记为已解决。。非常感谢。