Natural join与笛卡尔积的区别

MySQL中natural join的用法,以学生表与选课表进行自然连接为例:

1
2
3
select *
from 学生表
natural join 选课表

MySQL中笛卡尔积连接的用法,同样以学生表与选课表进行连接为例:

1
2
3
select *
from 学生表,选课表
where 学生表.学号=选课表.学号

这两种连接方法的区别在于:
(1)natural join时,外键名称(foreign key)与所指向的表的主键名称(primary key)必须相同;
(2)natural join时会合并相同的列;
(3)进行笛卡尔积时不会合并相同的列,而且外键名称(foreign key)与所指向的表的主键名称(primary key)不一定相同。

LaTeX使用笔记

1. 设置一级二级三级标题

1
2
3
\section{一级标题}
\subsection{二级标题}
\subsubsection{二级标题}

2. 设置多级列表

{itemize}命令

{itemize}命令对文本进行简单的排列,不是采用序号,而是实心圆点符号。这个命令需要和\item配合使用。作为演示,输入如下代码:

1
2
3
4
5
\begin{itemize}
\item Latex 1
\item Latex 2
\item Latex 3
\end{itemize}

编译后可以看出在每一段前都加上了实心圆点符号进行排列。

如果我们不想使用实心圆点符号进行排列的话可以在\item[]的中括号里面指定需要的编号符号。例如我们使用-进行编号,改变代码如下:

1
2
3
4
5
\begin{itemize}
\item[-] Latex 1
\item[-] Latex 2
\item[-] Latex 3
\end{itemize}

编译输出后可以看到编号的符号被换成来“-”。当然我们也可以采用其他的符号进行编号。

{enumerate}命令

{enumerate}产生带需要的编号,默认是采用数字1,2,3……进行排列。如果你想用其他排列方式例如(1),(2)…的话需要先加载\usepackage{enumerate},然后再使用。分别输入如下代码使用默认和自定义的编号方式进行编号:

1
2
3
4
5
\begin{enumerate}
\item Latex 1
\item Latex 2
\item Latex 3
\end{enumerate}

1
2
3
4
5
\begin{enumerate} [(1)]
\item Latex 1
\item Latex 2
\item Latex 3
\end{enumerate}

3. 设置图标标题样式

需要导入\caption和\subcaption 包,可以改变caption和label的字体、编码样式、对齐方式、格式等。

插入子图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\begin{figure}
\centering
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Caption 1}\label{fig:1a}
\end{subfigure}
\quad
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Caption 2}\label{fig:1b}
\end{subfigure}
\caption{Main figure caption}\label{fig:1}
\end{figure}

插入子表

可以用\columnwidth代替\width。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
\begin{table}
\centering
\begin{subtable}[t]{2in}
\centering
\begin{tabular}{|l|l|l|}
\hline
100 & 200 & 300\\
\hline
400 & 500 & 600\\
\hline
\end{tabular}
\caption{Caption 1}\label{table:1a}
\end{subtable}
\quad
\begin{subtable}[t]{2in}
\centering
\begin{tabular}{|l|l|l|}
\hline
100 & 200 & 300\\
\hline
400 & 500 & 600\\
\hline
\end{tabular}
\caption{Caption 2}\label{table:1b}
\end{subtable}
\caption{Main table caption}\label{table:1}
\end{table}

设置caption的编号样式

1
2
3
4
5
% change the style of the caption numbering.
\renewcommand{\thetable}{\alph{table}}
\renewcommand{\thefigure}{\Alph{table}}
\renewcommand{\thesubtable}{\Roman{subtable}}
\renewcommand{\thesubfigure}{\arabic{subfigure}}
Counter style Code Example
Arabic numerals \arabic{counter} 1, 2
Lower case letters \alph{counter} a, b
Upper case letters \Alph{counter} A, B
Lower case Roman numerals \roman{counter} i, ii
Upper case Roman numerals \Roman{counter} I, II

将其中的counter用table或者subtable代替就得到了想要的编号样式。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\renewcommand{\thefigure}{\Roman{figure}}
\renewcommand{\thesubfigure}{\arabic{subfigure}}
\begin{figure}
\centering
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Arabic numerals}\label{fig:1a}
\end{subfigure}
\quad
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Arabic numerals}\label{fig:1b}
\end{subfigure}
\caption{Capital Roman numerals}\label{fig:1}
\end{figure}

图标编号跟章关联起来

类似,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% This applies if you have chapters
\renewcommand{\thefigure}{\thechapter.\Alph{figure}} % set caption label style to 1.A
\renewcommand{\thesubfigure}{\arabic{subfigure}}
\begin{figure}
\centering
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Arabic numerals}\label{fig:1a}
\end{subfigure}
\quad
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Arabic numerals}\label{fig:1b}
\end{subfigure}
\caption{Chapter number dot figure letter}\label{fig:1}
\end{figure}

标题样式设置

导入宏包的时候可以直接设置全局样式,即所有的caption样式都变化,示例如下:

1
2
3
4
5
% options apply to all captions
\usepackage[OPTIONS]{caption}
% applies to all subfigure and subtable captions
\usepackage[OPTIONS]{subcaption}

1
2
3
4
5
% will apply to all captions
\usepackage[labelfont=it,textfont={bf,it}]{caption}
% will apply to all subcaptions
\usepackage[labelfont=bf,textfont=normalfont,singlelinecheck=off,justification=raggedright]{subcaption}

也可以使用\captionsetup设置标题样式,这样后面所有的标题样式都是根据\captionsetup重新设置的,示例代码如下:

1
\captionsetup[FLOAT_TYPE]{OPTIONS}

FLOAT_TYPE可以是table、subtable、figure、subfigure等,下面的代码展示了label font、text font的设置以及子标题的对齐方式的设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% for figures: caption label is italic, the caption text is bold / italic
\captionsetup[figure]{labelfont=it,textfont={bf,it}}
% for subfigures: caption label is bold, the caption text normal.
% justification is raggedright (i.e. left aligned)
% singlelinecheck=off means that the justification setting is used even when the caption is only a single line long.
% if singlelinecheck=on, then caption is always centered when the caption is only one line.
\captionsetup[subfigure]{labelfont=bf,textfont=normalfont,singlelinecheck=off,justification=raggedright}
\begin{figure}
\centering
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Caption}\label{fig:1a}
\end{subfigure}
\quad
\begin{subfigure}[t]{1in}
\centering
\includegraphics[width=1in]{placeholder}
\caption{Caption}\label{fig:1b}
\end{subfigure}
\caption{Main figure caption.}\label{fig:1}
\end{figure}

其中singlelinecheck=off是设置即使是一行的标题也采用justification的设置,否则默认居中。
标题大小设置如下

1
\captionsetup{font={scriptsize}}

【转】SQLite中execSql、query、rawQuery的用法

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。
对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。

execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句
rawQuery()方法用于执行select语句。

(1)execSQL()方法的使用案例
execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。

1
2
3
SQLiteDatabase sqLiteDatabase = ....;
sqLiteDatabase .execSQL("insert into person(name, age) values(?,?)", new Object[]{"测试数据", 4});
sqLiteDatabase .close();

(2)rawQuery()方法的使用案例
rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:

1
2
3
4
5
SQLiteDatabase sqLiteDatabase = ....;
Cursor cursor = sqLiteDatabase.rawQuery("select * from personwhere name like ?and age=?", new String[]{"%iteedu%", "4"});
//......
cursor.close();
sqLiteDatabase .close();

(3)query和rawQuery
下面两个分别是query和rawQuery的查询语句,主要区别是rawQuery是直接使用SQL语句进行查询的,也就是第一个参数字符串,在字符串内的“?”会被后面的String[]数组逐一对换掉;而query函数是Android自己封装的查询API。

1
2
Cursor cursor = db.rawQuery("select name from *** where id=?", new String[]{"1"});
Cursor cursor = db.query("***", new String[]{"name"}, "id=?", new String[]{"1"}, null, null, null);

query对比rawQuery的好处在于,当你用rawQuery在写入SQL语句的时候,有可能写错了或者写漏了什么单词拼写错误的时候,而query相对来讲出错的机率就比较小。这两者调的都是同一个方法 rawQueryWithFactory。

如果为了防止SQL注入,推荐使用query,由于query的参数一段段都是分开的。但是如果为了更好的跨平台推荐大家使用rawQuery原始SQL语句直接操作,在代码和处理效率上都有不小的提高,不过要做好SQL语句异常处理。

XAMPP中数据库文件存放的路径以及删除数据库时某类错误的解决方法

XAMPP中数据库文件存放的路径

(1)For Mac, your database files are located at:
/Applications/XAMPP/xamppfiles/var/mysql

(2)For Wind, your database files are located at:
C:\xampp\mysql\data

删除数据库时某类错误的解决方法

错误

运行

1
drop database student

可是却得到了ERROR 1010: Error dropping database (can’t rmdir ‘./student’)的错误信息。

解决方法

删除/var/mysql/student下面的所有文件,不要删除student本身:

1
2
3
sudo cd student
ls -all
sudo rm -rf *

然后再在MySQL里面通过命令行:

1
drop database student

就可以了。

Android中获取Context的方法们的区别与联系

getActivity():

This method gives the context of the Activity. You can use it is like the yourActivity.this. The method getActivity() is normally used in fragments to get the context of the activity in which they are inserted or inflated.

getContext():

Returns the context the view is currently running in. Usually the currently active Activity. getContext() is not defined in an Activity. It’s used in a View (or View subclass) to get a reference to the enclosing context (an Activity).

Difference between getActivity() and getContext()

Activity is a subclass of Context.

When you call getActivity() you get an Activity which is a Context as well. But when you call getContext() you will get a Context which might not be an Activity.

When using newer version of Support Library, when Fragment is not hosted by an Activity you can get different objects when calling getActivity() and getContext().

getApplication():

getApplication() is available to Activity and Services only. Although in current Android Activity and Service implementations, getApplication() and getApplicationContext() return the same object, there is no guarantee that this will always be the case (for example, in a specific vendor implementation). So if you want the Application class you registered in the Manifest, you should never call getApplicationContext() and cast it to your application, because it may not be the application instance (which you obviously experienced with the test framework).

getApplicationContext():

Activity.getApplicationContext(): Returns the context for the entire application (the process all the Activities are running inside of). Use this instead of the current Activity context if you need a context tied to the lifecycle of the entire application, not just the current Activity.

Android tools的一些知识

xmlns:tools=”http://schemas.android.com/tools

tools属性可以分为两种:一种是影响Lint提示的,一种是关于xml布局设计的。

Lint相关的属性:

1
2
3
tools:ignore //告诉Lint忽略xml中的某些警告。
tools:targetApi
tools:locale

我们常用的tools第二种属性:在UI设计的时候覆盖标准的android属性。

比如Android开发中在布局文件里面都会有如下面的内容:

1
2
3
4
5
6
7
<....
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
/>

其中tools起什么作用呢?可以参考文档http://tools.android.com/tech-docs/tools-attributes。

在官方文档中有说这么一句: These are attributes which are used when the layout is rendered inthe tool, but have no impact on the runtime. This is useful if you for examplewant to put sample data in your textfields for when you are editing the layout,but you don’t want those attributes to affect your running app.

所以tools中第二种属性用于渲染布局,而不会影响到程序运行。也就是说只在预览布局时出现,在程序运行时相当于该属性不存在。比如上面例子中的,tools:context=”.MainActivity”,目的是让Layout Editor知道当前布局对应哪一个Activity,来更好的显示预览界面,假如当前使用了一个主题,或者使用了一个ActionBar,就都可以显示出来。如果不添加这个属性,就只会显示布局文件定义的界面。

tools:text VS android:text

转自:http://blog.csdn.net/m0_37222746/article/details/54340893
既然TextView有text属性,我们可以为它提供初始值,在应用运行前就知道它大概的样子。而当应用在设备中真正运行时,所有tools打头的属性都会被忽略,上面的文字不会显示出来。

例子如下:


注意最后一个属性。它只有在编辑预览的时候有效,运行的时候是根本就不会打入apk中的。

Android LayoutInflater详解

LayoutInflater和findViewById()的用法区别

LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。

区别在于:
(1)LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化。对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
(2)findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

获得LayoutInflater实例的三种方式

1
2
3
4
1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater()
2. LayoutInflater inflater = LayoutInflater.from(context);
3. LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);

其实,这三种方式本质是相同的,从源码上看最终本质是都是调用的Context.getSystemService()。

【转】List和ArrayList的区别

转自:http://www.cnblogs.com/aisiteru/articles/1151874.html

定义

List是一个接口,而ArrayList是一个类。
ArrayList继承并实现了List。

用法

List不能被构造,但可以向上面那样为List创建一个引用,而ArrayList就可以被构造。

1
2
3
4
List list; //正确 list=null;
List list = new List(); // 是错误的用法
List list = new ArrayList();//这句创建了一个ArrayList的对象后把它上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
ArrayList list = new ArrayList();//创建一对象则保留了ArrayList的所有属性。

源码分析

1
2
3
4
5
6
7
8
9
10
11
import java.util.*;
public class TestList{
public static void main(String[] args){
List list = new ArrayList();
ArrayList arrayList = new ArrayList();
list.trimToSize(); //错误,没有该方法。
arrayList.trimToSize(); //ArrayList里有该方法。
}
}

如果这个样子:

1
List a = new ArrayList();

则a拥有List与ArrayList的所有属性和方法,不会减少。

如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),则a.i是调用了List中的i,a.f()是调用了ArrayList中的f()。

问题的关键

为什么要用 List list = new ArrayList(),而不用 ArrayList alist = new ArrayList()呢?

答案:List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变下面这一行就行了,其它使用了list地方的代码根本不需要改动:

1
List list = new LinkedList();

假设你开始用:

1
ArrayList alist = new ArrayList();

这下你有的改了,特别是如果你使用了ArrayList特有的方法和属性。

举例一:
地区用这行代码定义:

1
List arr = new ArrayList();

行业用这行代码定义:

1
ArrayList arr = new ArrayList();

上面两个定义的区别在于,行业里用到了ArrayList的特殊的方法。

举例二:
在类的方法中,如下声明:

1
private void doMyAction(List list){}

这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数。

如果开发的时候觉得ArrayList、HashMap的性能不能满足你的需要,可以通过实现List、Map(或者Collection)来定制你的自定义类。

Android Support Library v4、v7、v13包的区别

用处

这三者本质上就是三个java library。如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要添加额外的包来使用这些新特性,这就是 Android Support 包。

区别

Android Support v4

这个包是为了照顾Android 1.6及以上版本而设计的,在开发中,默认都会使用到这个包。

Android Support v7

这个包是为了照顾Android 2.1及以上版本而设计的,但是不能兼容低版本 Android系统,如果开发中不考虑 1.6 ,可以采用这个包。另外要注意的是,v7 包是依赖 v4 包的,即引入 v7 包的话要同时引入 v4 包。

Android Support v13

这个包是为了照顾Android 3.2及以上版本而设计的,一般开发中不会用到,平板开发可能会用到。

使用

其实在android studio里面查看或者修改support包的版本非常简单,参考下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.example.scarlettli.viewpagerdemo"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//引入support V4
compile 'com.android.support:support-v4:19.0.0'
//这是引入support V7
compile 'com.android.support:appcompat-v7:22.1.1'
//引入support V13
compile 'com.android.support:support-v13:21.0.+'
}