目前正在创建一个从资产中复制sql数据库的应用程序,然后允许我按年份查询搜索,电影名称并在文本视图中显示所有结果。得到一个致命的错误,只是立即崩溃应用程序,不知道该怎么做..包括在代码下给我错误的行。
activity_main.xml中
<?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>
MainActivity.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.");
}
}
}
OpenDatabase.java
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();
应用程序崩溃.. logcat:
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)
答案 0 :(得分:1)
问题(很可能是根据错误,没有覆盖整个代码,只是当前的问题)是你的数据库名称。
你宣布:
private static final String DATABASE_NAME = "src/main/ActorsFilmography.db";
这包含一个路径分隔符(即'/')。这是不允许的。
如果您将其更改为ActorsFilmography
,则可能会解决此问题(没有.db
,因为它已将扩展名设置为.db
,因为它是一个数据库)。 / p>
此外,请注意留下的评论,以后您提出问题,请参阅https://stackoverflow.com/help/how-to-ask